洛谷 1373:
题意:
n*m的矩阵,每个点有个值在0~k之间,从任意点出发A取当前点的值,B取下个点(上个点向下或想右)的值,A,B轮流取,要求以A开头以B结束A,B
取的值%(k+1) 想等的方案有多少。
思路:
很容易想到五维的定义:dp[i][j][k][w][0/1] 表示 到达i,j这个格子,A取了k,B取了w,该A或B取的方案数。
空间复杂度:800*800*15*15*2=288000000 288000000/1024/1024=274.6 开不下
考虑到其实A取多少B取多少 不影响答案,影响答案的是A,B的差值。
定义 dp[i][j][w][0/2] 到ij这个格子,A,B的差值是w,该A/B取的方案数(w是A-B的值)
考虑转移: 显然 dp[i][j][??][0] 只能由dp[i][j-1][??][1] 和dp[i-1][j][??][1]转移过来
考虑??: 当前A取,差值为x dp[i][j][x][0]=dp[i-1][j][(x-a[i][j]+k)%k)][1]+dp[i][j][x][0]+dp[i][j-1][(x-a[i][j]+k)%k)][1];
当前B取,差值为y dp[i][j][x][1]=dp[i-1][j][(x+a[i][j])%k][0]+dp[i][j][x][1]+dp[i][j-1][(x+a[i][j]+k)%k][1];
注:此处k为读入的k+1,a[i][j]表示ij格的值
思路就完了,再加上些细节就过了