历届试题 地宫取宝
时间限制:1.0s 内存限制:256.0MB
锦囊1
锦囊2
锦囊3
问题描述
X 国王有一个地宫宝库。是 n x m 个格子的矩阵。每个格子放一件宝贝。每个宝贝贴着价值标签。
地宫的入口在左上角,出口在右下角。
小明被带到地宫的入口,国王要求他只能向右或向下行走。
走过某个格子时,如果那个格子中的宝贝价值比小明手中任意宝贝价值都大,小明就可以拿起它(当然,也可以不拿)。
当小明走到出口时,如果他手中的宝贝恰好是k件,则这些宝贝就可以送给小明。
请你帮小明算一算,在给定的局面下,他有多少种不同的行动方案能获得这k件宝贝。
地宫的入口在左上角,出口在右下角。
小明被带到地宫的入口,国王要求他只能向右或向下行走。
走过某个格子时,如果那个格子中的宝贝价值比小明手中任意宝贝价值都大,小明就可以拿起它(当然,也可以不拿)。
当小明走到出口时,如果他手中的宝贝恰好是k件,则这些宝贝就可以送给小明。
请你帮小明算一算,在给定的局面下,他有多少种不同的行动方案能获得这k件宝贝。
输入格式
输入一行3个整数,用空格分开:n m k (1<=n,m<=50, 1<=k<=12)
接下来有 n 行数据,每行有 m 个整数 Ci (0<=Ci<=12)代表这个格子上的宝物的价值
接下来有 n 行数据,每行有 m 个整数 Ci (0<=Ci<=12)代表这个格子上的宝物的价值
输出格式
要求输出一个整数,表示正好取k个宝贝的行动方案数。该数字可能很大,输出它对 1000000007 取模的结果。
样例输入
2 2 2
1 2
2 1
1 2
2 1
样例输出
2
样例输入
2 3 2
1 2 3
2 1 5
1 2 3
2 1 5
样例输出
14
题解:dp,坑爹的是有价值为0的宝物,醉了
439710 | 609738062@qq.com | 地宫取宝 | 03-24 23:18 | 1.550KB | C++ | 正确 | 100 | 0ms | 3.398MB | 评测详情 |
1 #include <cstdio> 2 #include <cstring> 3 #include <stack> 4 #include <vector> 5 #include <algorithm> 6 7 #define ll long long 8 int const N = 55; 9 int const M = 205; 10 int const inf = 1000000000; 11 ll const mod = 1000000007; 12 13 using namespace std; 14 15 int n,m,k; 16 int dp[55][55][15][15]; 17 int c[N][N]; 18 int ans; 19 20 void ini() 21 { 22 memset(dp,0,sizeof(dp)); 23 memset(c,0,sizeof(c)); 24 int i,j; 25 ans=0; 26 for(i=1;i<=n;i++){ 27 for(j=1;j<=m;j++){ 28 scanf("%d",&c[i][j]); 29 c[i][j]++; 30 } 31 } 32 } 33 34 void solve() 35 { 36 int i,j,cnt,v; 37 dp[1][1][0][0]=1; 38 dp[1][1][1][ c[1][1] ]=1; 39 40 for(i=1;i<=n;i++){ 41 for(j=1;j<=m;j++){ 42 if(i==1 && j==1) continue; 43 for(cnt=0;cnt<=k;cnt++){ 44 for(v=0;v<=13;v++){ 45 dp[i][j][cnt][ v ] = (dp[i][j][cnt][ v ]+dp[i][j-1][cnt][ v ])%mod; 46 dp[i][j][cnt][ v ] = (dp[i][j][cnt][ v ]+dp[i-1][j][cnt][ v ])%mod; 47 } 48 for(v=0;v<c[i][j];v++){ 49 dp[i][j][cnt+1][ c[i][j] ] = (dp[i][j][cnt+1][ c[i][j] ]+dp[i][j-1][cnt][ v ])%mod; 50 dp[i][j][cnt+1][ c[i][j] ] = (dp[i][j][cnt+1][ c[i][j] ]+dp[i-1][j][cnt][ v ])%mod; 51 } 52 } 53 } 54 } 55 } 56 57 void out() 58 { 59 int v; 60 for(v=0;v<=13;v++){ 61 ans=(ans+dp[n][m][k][v])%mod; 62 } 63 printf("%d ",ans); 64 } 65 66 int main() 67 { 68 //freopen("data.in","r",stdin); 69 //scanf("%d",&T); 70 // for(cnt=1;cnt<=T;cnt++) 71 //while(T--) 72 while(scanf("%d%d%d",&n,&m,&k)!=EOF) 73 { 74 ini(); 75 solve(); 76 out(); 77 } 78 }