一个简单的DP。
只能往下和往右传递。
对DP不够敏感,打院赛的时候用记忆化搜索过的,浪费不少时间。
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <math.h>
using namespace std;
#define LL long long
const int maxn=55;
const int mod = 19260817;
int mp[maxn][maxn];
int dp[maxn][maxn][3333];
int main()
{
int T;
scanf("%d",&T);
while(T--){
int n,m,k;
scanf("%d %d %d",&n,&m,&k);
memset(dp,0,sizeof dp);
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
scanf("%d",&mp[i][j]);
}
}
int ans = 0;
if(mp[1][1]==-1){
printf("0\n");
}else{
dp[1][1][mp[1][1]]=1;
ans+=dp[1][1][k];
}
int now=mp[1][1];
for(int i=2;i<=m;i++){
if(mp[1][i]==-1) break;
now+=mp[1][i];
dp[1][i][now]=1;
if(now==k) (ans+=1)%=mod;
}
now=mp[1][1];
for(int i=2;i<=n;i++){
if(mp[i][1]==-1) break;
now+=mp[i][1];
dp[i][1][now]=1;
if(now==k) (ans+=1)%=mod;
}
for(int i=2;i<=n;i++){
for(int j=2;j<=m;j++){
if(mp[i][j]==-1) continue;
for(int p=k;p>=0;p--){
dp[i][j][p]=dp[i-1][j][p-mp[i][j]]%mod+dp[i][j-1][p-mp[i][j]]%mod;
dp[i][j][p]%=mod;
}
(ans+=dp[i][j][k])%=mod;
}
}
printf("%d\n",ans);
}
}