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 }

 

posted @ 2018-10-13 10:28  Ressed  阅读(127)  评论(0编辑  收藏  举报