历届试题 地宫取宝

来源:互联网 发布:张辽和关羽谁厉害知乎 编辑:程序博客网 时间:2024/06/01 09:24

思路:参考的大神的代码,加了一点注释,地址:http://blog.csdn.net/rodestillfaraway/article/details/50529814

AC代码:

#include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <queue>#include <stack>#include <map>#include <cstring>#include <climits>#include <cmath>#include <cctype>typedef long long ll;using namespace std;const int mod = 1000000007;int dp[55][55][15][15];//前2个是坐标,第三个是目前取到的件数,第四个是目前的最大值int map1[55][55];int main(){    int n,m,k;    while(scanf("%d%d%d",&n,&m,&k) != EOF)    {        int max = 0;        for(int i=1; i<=n; i++)        {            for(int j=1; j<=m; j++)            {                scanf("%d",&map1[i][j]);                map1[i][j]++;//在这加1,是因为物品的价值有可能为0,所有物品价值数加1,不影响最后的结果                if(map1[i][j] > max)                {                    max = map1[i][j];                }            }        }        memset(dp,0,sizeof(dp));        dp[1][1][0][0] = 1;        dp[1][1][1][map1[1][1]] = 1;        for(int i=1; i<=n; i++)        {            for(int j=1; j<=m; j++)            {                //在这一个点不取,.总件数为0                dp[i][j][0][0] += dp[i-1][j][0][0] + dp[i][j-1][0][0];//注意是加等                dp[i][j][0][0] %= mod;                for(int p=1; p<=k; p++)                {                    //在这一点不取,总件数为p                    for(int val = 0; val <= max; val++)                    {                        dp[i][j][p][val] += dp[i-1][j][p][val];                        dp[i][j][p][val] %= mod;                        dp[i][j][p][val] += dp[i][j-1][p][val];                        dp[i][j][p][val] %= mod;                    }                    //到目前为止,只取1件,且目前的这一点取                    if(p == 1)                    {                        dp[i][j][1][map1[i][j]] += dp[i-1][j][0][0];                        dp[i][j][1][map1[i][j]] %= mod;                        dp[i][j][1][map1[i][j]] += dp[i][j-1][0][0];                        dp[i][j][1][map1[i][j]] %= mod;                    }                    //到目前为止,只取p件,且目前的这一点取                    else                    {                        for(int val = 0; val < map1[i][j]; val++)                        {                            dp[i][j][p][map1[i][j]] += dp[i-1][j][p-1][val];                            dp[i][j][p][map1[i][j]] %= mod;                            dp[i][j][p][map1[i][j]] += dp[i][j-1][p-1][val];                            dp[i][j][p][map1[i][j]] %= mod;                        }                    }                }            }        }        int sum = 0;        for(int i=0; i<=max; i++)        {            sum += dp[n][m][k][i];            sum %= mod;        }        printf("%d\n",sum);    }    return 0;}


0 0
原创粉丝点击