序号:1379
广场车神
Time Limit:1s Memory Limit:512MB
题目描述:
小 D 是一位著名的车手,他热衷于在广场上飙车。每年儿童节过后,小 D 都会在广场上举行一场别样的车技大赛。 小 D 所在的广场可以看作一个W×H 的网格,初始时小 D 位于左下角的 (1,1) 处,他的目的地是位于右上角的 (W,H)。每次移动时,小 D 会选择位于他右上方的一个方格,并移动到这个方格。由于车技的限制,每次移动小 D 的横坐标变化和纵坐标变化都不能超过 K。也就是说,每次小 D 会在以当前位置为左下角的边长为 K+1 的正方形中选择一个方格作为移动的目的地,但不能原地不动。 作为小 D 的竞争对手,小 J 想知道小 D 一共有多少种从 (1,1) 移动到 (W,H) 的方案数,以提高他在大赛中胜出的概率。请你完成程序,协助小 J 在这场大赛中战胜小 D。由于方案数过大,你需要将答案对 998244353 进行取模。
输入格式:
输入包含三个正整数 W,H,K。
输出格式:
输出一个整数表示答案。
输入样例:
3 3 2
输出样例:
26
样例解释
数据范围约定
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll mod=998244353;
const ll INF=1e9;
ll n,m,T,x,y;
int k;
ll s[5555][5555];
ll dp[5555][5555];
int main(){
ios::sync_with_stdio(false);
cin>>n>>m>>k;
k++;
s[1][1]=dp[1][1]=1;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(i==1 and j==1){
continue;
}
int x=max(i-k+1,1);
int y=max(j-k+1,1);
dp[i][j]=(s[i-1][j]+s[i][j-1]-s[i-1][j-1]-s[x-1][j]-s[i][y-1]+s[x-1][y-1]+mod*3)%mod;
s[i][j]=(s[i-1][j]+s[i][j-1]-s[i-1][j-1]+mod+dp[i][j])%mod;
}
}
cout<<dp[n][m];
return 0;
}