[And] two-dimensional prefix

https://nanti.jisuanke.com/t/31434

Direct transport problem solution:

https://www.cnblogs.com/dilthey/p/9757781.html

Consider Common  D P [ I ] [ J ] = [Sigma A = L + . 1 I [Sigma B = D + . 1 J ( ( A == I & & B == J ) ? 0 : D P [ A ] [ B ] ) DP [I] [J] = [sigma] a = L + D + 1J 1iΣb = ((a == J == I && B) 0:? DP [a] [B]), obviously a large block to remove the entire a small cell sum,

Where, D = max ( 0 , I - K - . 1 ) D = max (0, I-K-. 1) of the open border, L = max ( 0 , J - K - . 1 ) L = max (0, J -k-1) to the left to open the border,

If we honestly pure violence DP, obviously  O ( W H K 2 ) O (WHK2) time complexity, can live ghosts ......

And optimization requires a prefix, it may be assumed  S U m [ I ] [ J ] = [Sigma A = . 1 I [Sigma B = . 1 J D P [ A ] [ B ] [I] SUM [J] = [sigma] A = 1iΣb = 1jdp [a] [b] ,

So, apparently the state transition equation  D P [ I ] [ J ] = ( S U m [ I - . 1 ] [ J ] + S U m [ I ] [ J - . 1 ] - S U m [ I - . 1 ] [ J - . 1 ] ) - ( S U m [ D ] [ J ]+sum[i][L]sum[D][L])dp[i][j]=(sum[i−1][j]+sum[i][j−1]−sum[i−1][j−1])−(sum[D][j]+sum[i][L]−sum[D][L]),

Then clearly state transition equation:

sum[i][j]=(sum[i1][j]+sum[i][j1]sum[i1][j1])+dp[i][j]=2(sum[i1][j]+sum[i][j1]sum[i1][j1])(sum[D][j]+sum[i][L]sum[D][L])sum[i][j]=(sum[i−1][j]+sum[i][j−1]−sum[i−1][j−1])+dp[i][j]=2(sum[i−1][j]+sum[i][j−1]−sum[i−1][j−1])−(sum[D][j]+sum[i][L]−sum[D][L])

 

Finally, easy to know that the answer is  D P [ H ] [ W ] = S U m [ H ] [ W ] - ( S U m [ H - . 1 ] [ J ] + S U m [ I ] [ W - . 1 ] - S U m [ H - . 1 ] [ W - . 1 ] )dp[h][w]=sum[h][w]−(sum[h−1][j]+sum[i][w−1]−sum[h−1][w−1])。

 

AC Code:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

const ll MOD=998244353;
const int maxn=2000+10;

int w,h,k;
ll sum[maxn][maxn];

int main()
{
scanf("%d%d%d",&w,&h,&k);

memset(sum,0,sizeof(sum));
sum[1][1]=1;
for(int i=1;i<=h;i++)
{
for(int j=1;j<=w;j++)
{
if(i==1&&j==1) continue;
int L=max(0,i-k-1),D=max(0,j-k-1);
sum[i][j]=2*(sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1])-(sum[L][j]+sum[i][D]-sum[L][D]);
while(sum[i][j]<0) sum[i][j]+=MOD; sum[i][j]%=MOD;
}
}
ll ans=sum[h][w]-sum[h-1][w]-sum[h][w-1]+sum[h-1][w-1];
while(ans<0) ans+=MOD; ans%=MOD;
printf("%lld",ans);
}

Guess you like

Origin www.cnblogs.com/hgangang/p/11562800.html