比赛时候,没有把两种状态分离。然后一直找错误。。。。。
被自己的傻萌哭了= = ///
#include <iostream>
#include <stdio.h>
#include <algorithm>
using namespace std;
#define maxn 51
const int mod = 1000000007;
int mp[maxn][maxn];
int dp[maxn][maxn][13][13*13][2];
int n,m,k;
int quex[maxn * maxn],quey[maxn * maxn];
int head, tail;
int vis[maxn][maxn];
bool range(int x, int y)
{
if(x < 1 || x > n) return false;
if(y < 1 || y > m) return false;
return true;
}
int main()
{
scanf("%d %d %d",&n,&m,&k);
for(int i = 1;i <= n;i++)
{
for(int j = 1;j <= m;j++)
scanf("%d",&mp[i][j]);
}
dp[1][1][0][0][0] = 1;
// dp[1][1][1][mp[1][1]] = 1;
head = tail = 0;
quex[tail] = 1;
quey[tail++] = 1;
int big = 0;
while(head < tail)
{
int x = quex[head];
int y = quey[head++];
if(vis[x][y]) continue;
vis[x][y] = 1;
int son1x = x + 1,son1y = y;
int son2x = x, son2y = y + 1;
if(range(son1x,son1y)) {quex[tail]=son1x;quey[tail++]=son1y;}
if(range(son2x,son2y)) {quex[tail]=son2x;quey[tail++]=son2y;}
big += mp[x][y];
for(int i = 0;i <= k;i++)
{
for(int j = 0;j <= big;j++)
{
dp[x][y][i][j][0] += (dp[x-1][y][i][j][0]+dp[x-1][y][i][j][1]
+dp[x][y-1][i][j][0]+dp[x][y-1][i][j][1]);
//dp[x][y][i][j] %= mod;
if(dp[x][y][i][j][0] > mod) dp[x][y][i][j][0] -= mod;
}
}
for(int i = 1;i <= k;i++)
{
for(int j = 0;j < mp[x][y];j++)
{
dp[x][y][i][mp[x][y]][1] += dp[x][y][i-1][j][0];
if(dp[x][y][i][mp[x][y]][1] > mod) dp[x][y][i][mp[x][y]][1] -= mod;
}
}
/* printf("now x : %d y : %d \n",x,y);
for(int i = 0;i <= k;i++)
{
for(int j = 0;j <= big;j++)
{
printf("(%3d %3d)",dp[x][y][i][j][0],dp[x][y][i][j][1]);
}
printf("\n");
}*/
}
int ans = 0;
for(int i = 0;i <= big;i++)
{
ans += dp[n][m][k][i][0]+dp[n][m][k][i][1];
if(ans > mod) ans-=mod;
}
printf("%d\n",ans);
return 0;
}