• 2014 蓝桥杯 预赛 c/c++ 本科B组 第九题:地宫取宝(12') [ dp ]


      历届试题 地宫取宝  
    时间限制:1.0s   内存限制:256.0MB
       
    锦囊1
     
    锦囊2
     
    锦囊3
     
    问题描述
      X 国王有一个地宫宝库。是 n x m 个格子的矩阵。每个格子放一件宝贝。每个宝贝贴着价值标签。

      地宫的入口在左上角,出口在右下角。

      小明被带到地宫的入口,国王要求他只能向右或向下行走。

      走过某个格子时,如果那个格子中的宝贝价值比小明手中任意宝贝价值都大,小明就可以拿起它(当然,也可以不拿)。

      当小明走到出口时,如果他手中的宝贝恰好是k件,则这些宝贝就可以送给小明。

      请你帮小明算一算,在给定的局面下,他有多少种不同的行动方案能获得这k件宝贝。
    输入格式
      输入一行3个整数,用空格分开:n m k (1<=n,m<=50, 1<=k<=12)

      接下来有 n 行数据,每行有 m 个整数 Ci (0<=Ci<=12)代表这个格子上的宝物的价值
    输出格式
      要求输出一个整数,表示正好取k个宝贝的行动方案数。该数字可能很大,输出它对 1000000007 取模的结果。
    样例输入
    2 2 2
    1 2
    2 1
    样例输出
    2
    样例输入
    2 3 2
    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 }
  • 相关阅读:
    hdu 1240:Asteroids!(三维BFS搜索)
    hdu 2199:Can you solve this equation?(二分搜索)
    hdu 1195:Open the Lock(暴力BFS广搜)
    【ACM
    hrbustoj 1161:Leyni(树状数组练习)
    时间作为横轴的图表(morris.js)超越昨天的自己系列(8)
    Bean实例化(Spring源码阅读)-我们到底能走多远系列(33)
    Sharded实现学习-我们到底能走多远系列(32)
    初始化IoC容器(Spring源码阅读)-我们到底能走多远系列(31)
    一致性哈希算法 应用场景(转)
  • 原文地址:https://www.cnblogs.com/njczy2010/p/4364333.html
Copyright © 2020-2023  润新知