次元传送门:洛谷P1373
思路
设f[i][j][t][1/0]表示走到(i,j)时 小a减去uim的差值为t 当前是小a取(0) uim取(1)
那么转移就很明显了
f[i][j][t][
0]=(f[i][j][t][
0]+f[i-
1][j][(t-map[i][j]+k)%k][
1])%
1000000007;//因为当前是小a取 前一步是uim取 差值增加
f[i][j][t][0]=(f[i][j][t][
0]+f[i][j-
1][(t-map[i][j]+k)%k][
1])%
1000000007;
f[i][j][t][1]=(f[i][j][t][
1]+f[i-
1][j][(t+map[i][j]+k)%k][
0])%
1000000007;//因为当前是uim取 前一步是小a取 差值减少
f[i][j][t][1]=(f[i][j][t][
1]+f[i][j-
1][(t+map[i][j]+k)%k][
0])%
1000000007;
初始化
f[i][j][map[i][j]%k][
0]=
1;//因为小a可以从任意一个地方出发
答案存在每个点对应的f数组中 差值为0 且是uim取值的数组中
代码
#include<iostream>
using namespace std;
int f[
805][
805][
20][
2];
int map[
805][
805];
int n,m,k,ans;
int main()
{
cin>>n>>m>>
k;
k++
;
for(
int i=
1;i<=n;i++
)
for(
int j=
1;j<=m;j++
)
{
cin>>
map[i][j];
f[i][j][map[i][j]%k][
0]=
1;
}
for(
int i=
1;i<=n;i++
)
for(
int j=
1;j<=m;j++
)
for(
int t=
0;t<=k;t++
)
{
f[i][j][t][0]=(f[i][j][t][
0]+f[i-
1][j][(t-map[i][j]+k)%k][
1])%
1000000007;
f[i][j][t][0]=(f[i][j][t][
0]+f[i][j-
1][(t-map[i][j]+k)%k][
1])%
1000000007;
f[i][j][t][1]=(f[i][j][t][
1]+f[i-
1][j][(t+map[i][j]+k)%k][
0])%
1000000007;
f[i][j][t][1]=(f[i][j][t][
1]+f[i][j-
1][(t+map[i][j]+k)%k][
0])%
1000000007;
}
for(
int i=
1;i<=n;i++
)
for(
int j=
1;j<=m;j++
)
ans=(ans+f[i][j][
0][
1])%
1000000007;
cout<<
ans;
}
转载于:https://www.cnblogs.com/BrokenString/p/9901929.html