luogu1373 小a和uim之大逃离 (dp)
直接设f[i][j][k][l][2]是在(i,j)时两人分数是k,l,复杂度会爆掉
但其实只需要知道两人分数只差就行了
所以设f[i][j][k][2],k是分数之差%(K+1),最后一位表示该谁走了
1 #include<bits/stdc++.h> 2 #define pa pair<int,int> 3 #define CLR(a,x) memset(a,x,sizeof(a)) 4 using namespace std; 5 typedef long long ll; 6 const int maxn=805,maxk=20,P=1e9+7; 7 8 inline ll rd(){ 9 ll x=0;char c=getchar();int neg=1; 10 while(c<'0'||c>'9'){if(c=='-') neg=-1;c=getchar();} 11 while(c>='0'&&c<='9') x=x*10+c-'0',c=getchar(); 12 return x*neg; 13 } 14 15 int N,M,K,w[maxn][maxn]; 16 int f[maxn][maxn][maxk][2]; 17 18 int main(){ 19 //freopen(".in","r",stdin); 20 int i,j,k; 21 N=rd(),M=rd();K=rd()+1; 22 for(i=1;i<=N;i++){ 23 for(j=1;j<=M;j++) 24 w[i][j]=rd(); 25 } 26 int ans=0; 27 for(i=1;i<=N;i++){ 28 for(j=1;j<=M;j++){ 29 for(k=0;k<K;k++){ 30 f[i][j][k][0]=(f[i-1][j][(k-w[i][j]+K)%K][1]+f[i][j-1][(k-w[i][j]+K)%K][1]+(w[i][j]==k))%P; 31 f[i][j][k][1]=(f[i-1][j][(k+w[i][j])%K][0]+f[i][j-1][(k+w[i][j])%K][0])%P; 32 } 33 ans=(ans+f[i][j][0][1])%P; 34 } 35 } 36 printf("%d\n",ans); 37 return 0; 38 }