标签:val span using 情况 style mes math 直接 空格
#include <iostream> #include <cmath> #include <cstring> using namespace std; const int N=1000000007; int ans,n,m,k;//n行m列 k个宝贝 int d[51][51][13][14];//保存状态 int p[51][51];//地图中每个地点宝贝的价值 int dfs(int x,int y,int num,int maxvalue){ if(d[x][y][num][maxvalue+1]!=-1){//如果状态库里有记录就直接在库里查找,不用递归计算 return d[x][y][num][maxvalue+1]; //我不明白为什么要坐标+1 //传进去的值是-1啊,为了防止越界当然要加一 } int t=0;//这个估计是行动方案数的记录 if(x==n-1&&y==m-1){//到达终点 if(p[x][y]>maxvalue){//价值比现有的高 if(num==k||num==k-1) t++; //刚好或差一件都可以+1 } else if(num==k){//刚好就可以+1 t++; } //cout << "终点" <<x << "," << y << " "<< num << " "<< maxvalue<< " " << t <<endl; d[x][y][num][maxvalue+1]=t; return d[x][y][num][maxvalue+1];//这个返回暂时没看懂 } if(x+1<n){//如果再走一步不越界 if(p[x][y]>maxvalue){//价值大于现在 执行下面两种情况 t+=dfs(x+1,y,num+1,p[x][y]); t%=N; t+=dfs(x+1,y,num,maxvalue); t%=N; } else{//小于就只有一种情况 继续走 t+=dfs(x+1,y,num,maxvalue); t%=N; } } if(y+1<m){//如果再走一步不越界 if(p[x][y]>maxvalue){//价值大于现在 执行下面两种情况 t+=dfs(x,y+1,num+1,p[x][y]); t%=N; t+=dfs(x,y+1,num,maxvalue); t%=N; } else{//小于就只有一种情况 继续走 t+=dfs(x,y+1,num,maxvalue); t%=N; } } //cout << "中途" <<x << "," << y << " "<< num << " "<< maxvalue<< " " << t <<endl; d[x][y][num][maxvalue+1]=t; return d[x][y][num][maxvalue+1];//max坐标+1 } int main(){ cin >> n >> m >> k; for(int i=0;i<n;i++) for(int j=0;j<m;j++) cin >> p[i][j]; // for(int i=0;i<51;++i) // for(int j=0;j<51;++j) // for(int p=0;p<13;++p) // for(int q=0;q<14;++q) // d[i][j][p][q]=-1; memset(d,-1,sizeof(d));//全部赋值-1 cout << dfs(0,0,0,-1); //从坐标(0,0) 宝物数0 最大值为-1开始 return 0; }
标签:val span using 情况 style mes math 直接 空格
原文地址:http://www.cnblogs.com/xieyupeng/p/7635145.html