从前有一家人有 n 瓶酒排成一行,第 i 瓶的价值为 vi。有一个酒贼去偷恰好 k 瓶酒。酒贼不能在连续的 d 瓶酒中偷走多于一瓶。求酒贼所有偷酒方案的价值和的和模998244353的值。
输入:
4 2 2
1 4 2 3
输出:14
输入: 5 2 3
1 5 7 7 3
输出:
20
输入:
12 4 2
107367523
266126484
149762920
57456082
857431610
400422663
768881284
494753774
152155823
740238343
871191740
450057094
#include<algorithm>
#include<cmath>
#include<cstring>
#include<queue>
using namespace std;
const int N=5010;
int n,k,d;
int a[N];
const int mod=998244353;
int f[N][N];//f[j][i]表示的是已经偷了 j 瓶酒(0<=j<=k),,当前如果在i这个地方偷一瓶酒,且所有偷酒方案的价值总和
int main()
{
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
cin>>n>>k>>d;
for(int i=1;i<=n;i++){
cin>>a[i];
}
f[1][1]=a[1]%mod;
f[1][0]=0;
for(int j=1;j<=k;j++){
for(int i=1;i<=n;i++){
f[j][i]=(f[j][i]%mod+f[j-1][i-d]%mod)%mod;
}
}
int maxn=-1;
for(int i=1;i<=n;i++) maxn=max(f[k][i],maxn);
cout<<maxn;
return 0;
}
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<queue>
using namespace std;
const int N=5010;
int n,k,d;
int a[N];
const int mod=998244353;
int f[N][N];//f[j][i]表示的是已经偷了 j 瓶酒(0<=j<=k),,当前如果在i这个地方偷一瓶酒,且所有偷酒方案的价值总和
int main()
{
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
cin>>n>>k>>d;
for(int i=1;i<=n;i++){
cin>>a[i];
}
f[1][1]=a[1]%mod;
f[1][0]=0;
for(int j=1;j<=k;j++){
for(int i=1;i<=n;i++){
f[j][i]=(f[j][i]%mod+f[j-1][i-d]%mod)%mod;
}
}
int maxn=-1;
for(int i=1;i<=n;i++) maxn=max(f[k][i],maxn);
cout<<maxn;
return 0;
}