题解 P1373 【小a和uim之大逃离】
题目链接:Link
Problem
Solution
又是一道大力dp题。因为起点不固定,所以必须要分是小a还是uim到达两种状态。
为啥我m敲成n还拿了50分。。。害得我查了半天。。。数据一点区分度有没有。。。
Code
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=805;
const int mod=1e9+7;
int n,m,p,a[maxn][maxn],f[maxn][maxn][20][2];
int main()
{
#ifdef local
freopen("pro.in","r",stdin);
#endif
scanf("%d%d%d",&n,&m,&p); p++;
for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) scanf("%d",&a[i][j]);
for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) f[i][j][a[i][j]%p][0]=1;
for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) for(int k=0;k<p;k++)
{
int v=f[i][j][k][0];
(f[i+1][j][((k-a[i+1][j])%p+p)%p][1]+=v)%=mod;
(f[i][j+1][((k-a[i][j+1])%p+p)%p][1]+=v)%=mod;
v=f[i][j][k][1];
(f[i+1][j][(k+a[i+1][j])%p][0]+=v)%=mod;
(f[i][j+1][(k+a[i][j+1])%p][0]+=v)%=mod;
}
int res=0;
for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) (res+=f[i][j][0][1])%=mod;
printf("%d\n",res);
return 0;
}
本作品由happyZYM采用知识共享 署名-非商业性使用-相同方式共享 4.0 (CC BY-NC-SA 4.0) 国际许可协议(镜像(简单版)镜像(完整版))进行许可。
转载请注明出处:https://www.cnblogs.com/happyZYM/p/11755925.html (近乎)全文转载而非引用的请在文首添加出处链接。