算法1
思路:这个题是动态规划类的题,感觉还是很难,但是对于动态规划的题,能清楚理解思路,代码还需要努力了,
这个题相当于把情况分为了四类,从上到下取和不取,从左到右取和不取,还是建议看看视频讲解会更清楚
C++ 代码
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int N=55,MOD=1000000007 ;
int n,m,k;
int w[N][N];//w存每个位置原始值是多少
int f[N][N][13][14];//状态,个数从0-12一共13个数,价格从-1-12一共14个数
int main(){
cin>>n>>m>>k;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>w[i][j];//依次读入矩阵中的每个数
w[i][j]++;
}
}
f[1][1][1][w[1][1]]=1;//第一个位置选
f[1][1][0][0]=1;//第一个位置不选
for(int i=1;i<=n;i++) //分析状态
for(int j=1;j<=m;j++){
if(i==1 && j==1)continue;//这里是因为第一个状态(1,1)已经分析过了
for(int u=0;u<=k;u++){//u枚举的是个数
for(int v=0;v<=13;v++)//v枚举的是价格
{
int &val=f[i][j][u][v];//后面会多次使用f[i][j][u][v]这个变量,所以先存一下
val=(val+f[i-1][j][u][v])%MOD;//从上到下走法,不取
val=(val+f[i][j-1][u][v])%MOD;//从左往右走法,不取
if(u>0&&v==w[i][j]){
for(int c=0;c<v;c++)
{
val=(val+f[i-1][j][u-1][c])%MOD;
val=(val+f[i][j-1][u-1][c])%MOD;
}
}
}
}
}
int res=0;
for(int i=0;i<=13;i++)res=(res+f[n][m][k][i])%MOD;
cout<<res<<endl;
return 0;
}