需要多余条件时 另开循环
遍历枚举都枚举的是当前状态
#include <iostream>
using namespace std;
const int mod=1e9+7;
int a[55][55];
int dp[55][55][15][15];
int main()
{
int n,m,k;
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]++;
}
int t=a[1][1];
dp[1][1][0][0]=1;
dp[1][1][1][t]=1;
//拿或不拿? 要拿满足条件
//dp枚举时枚举当前条件
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
for(int g=0;g<=k;g++)
for(int ma=0;ma<=13;ma++)
{
//不拿
//dp[i][j][g][ma]=(dp[i-1][j][g][ma]+dp[i][j-1][g][ma])%mod;
dp[i][j][g][ma]=((dp[i][j][g][ma]+dp[i-1][j][g][ma])%mod+dp[i][j-1][g][ma])%mod;
//拿 需要满足条件
if(g>0&&a[i][j]==ma)
for(int c=0;c<ma;c++)
{
dp[i][j][g][ma]=((dp[i][j][g][ma]+dp[i-1][j][g-1][c])%mod+dp[i][j-1][g-1][c])%mod;
}
}
int ans=0;
for(int i=1;i<=13;i++)
{
ans=(ans+dp[n][m][k][i])%mod;
}
cout<<ans;
return 0;
}