蓝桥——地宫寻宝(dfs递归 动态规划)**
题目:
dfs穷举递归:
#include<iostream> using namespace std; const int MOD=1000000007; int n,m,k; int data[50][50]; long long ans; void dfs(int x,int y,int max,int cnt){ if(x==n||y==m||cnt>k)return;//"cnt>k"剪枝 int cur=data[x][y]; if(x==n-1&&y==n-1)//在最后一个格子 { if(cnt==k||(cnt==k-1&&cur>max)){ ans++; if(ans>MOD){ ans%=MOD; } } if(cur>max){//可以取这个物品 dfs(x,y+1,cur,cnt+1); dfs(x+1,y,cur,cnt+1); } //对于价值较小,或者价值大但是不取物品的情况 dfs(x,y+1,max,cnt); dfs(x+1,y,max,cnt); } int main(){ cin>>n>>m>>k; for(int i=0;i<n;i++){ for(int j=0;j<m;j++){ cin>>data[i][j]; } } dfs(0,0,-1,0); cout<<ans; return 0; }
动态规划:
#include<iostream> #include<cstring> using namespace std; const int MOD=1000000007; int n,m,k; int data[50][50]; long long ans; long long cache[50][50][14][13]; long long dfs2(int x,int y,int max,int cnt){ //查缓存 if(cache[x][y][max+1][cnt]!=-1) return cache[x][y][max+1][cnt]; long long ans=0; int cur=data[x][y]; if(x==n||y==m||cnt>k)return 0;//"cnt>k"剪枝 if(x==n-1&&y==m-1)//在最后一个格子 { if(cnt==k||(cnt==k-1&&cur>max)){ ans++; if(ans>MOD){ ans%=MOD; } return ans; } } if(cur>max){//可以取这个物品 ans+=dfs2(x,y+1,cur,cnt+1); ans+=dfs2(x+1,y,cur,cnt+1); } //价值较小 或者价值较大但是不取 ans+=dfs2(x,y+1,max,cnt); ans+=dfs2(x+1,y,max,cnt); cache[x][y][max+1][cnt]=ans%MOD; return ans%MOD; } int main(){ cin>>n>>m>>k; for(int i=0;i<n;i++){ for(int j=0;j<m;j++){ cin>>data[i][j]; } } memset(cache,-1,sizeof(cache)); cout<<dfs2(0,0,-1,0); return 0; }
结果正确,不贴了