蓝桥杯 地宫取宝 各种DP模型合体

https://www.acwing.com/problem/content/1214/
4维DP 状态很难想出来。 具体可以看题解
https://www.acwing.com/solution/content/7116/

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<vector>
#include<queue>
#include<stack>
#include<cstring>
#include<unordered_map>
using namespace std;
typedef long long LL;
int a[55][55];
int f[55][55][15][15];//在i,j时拿了cnt个最大价值为c的方案数
int n,m,k;
const int mod=1000000007;
int main(){
    cin>>n>>m>>k;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            cin>>a[i][j];
            a[i][j]++;
        }
    }
    f[1][1][0][0]=1;
    f[1][1][1][a[1][1]]=1;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            for(int cnt=0;cnt<=k;cnt++){
                for(int c=0;c<=15;c++){
                    //不拿
                    f[i][j][cnt][c]=(f[i][j-1][cnt][c]+f[i][j][cnt][c])%mod;
                    f[i][j][cnt][c]=(f[i-1][j][cnt][c]+f[i][j][cnt][c])%mod;
                    if(a[i][j]==c && cnt>0){
                        for(int s=0;s<a[i][j];s++){
                            f[i][j][cnt][c]=(f[i][j-1][cnt-1][s]+f[i][j][cnt][c])%mod;
                            f[i][j][cnt][c]=(f[i-1][j][cnt-1][s]+f[i][j][cnt][c])%mod;
                        }
                    }
                }
            }
        }
    }
    int res=0;
    for(int i=1;i<=15;i++){
        res=(f[n][m][k][i]+res)%mod;
    }
    printf("%d\n", res);
  return 0;
}
//  freopen("testdata.in", "r", stdin);
posted @ 2021-05-16 10:22  一个经常掉线的人  阅读(58)  评论(0)    收藏  举报