CF1348E Phoenix and Berries(dp)
Posted ctyakwf
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CF1348E Phoenix and Berries(dp)相关的知识,希望对你有一定的参考价值。
本质上是一个状态机模型,因为对于每个来说,只有可能存在一个篮子是由同一堆中的不同颜色构成,否则都可以转化为这一类。
因此我们枚举f[i][j]为前i个,红色果实剩余j个,之后选择是否选择产生这种的篮子进行dp转化
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int N=1e5+10; const int mod=998244353; ll f[510][510]; int a[N],b[N]; int main(){ ios::sync_with_stdio(false); int n,k; cin>>n>>k; int i,j,l; memset(f,-1,sizeof f); for(i=1;i<=n;i++) cin>>a[i]>>b[i]; ll sum=0; f[0][0]=0; for(i=1;i<=n;i++){ sum+=a[i]+b[i]; for(j=0;j<k;j++){ if(f[i-1][j]<0) continue; for(l=1;l<k&&l<=a[i];l++){//枚举不同颜色的这个篮子由多少红色和蓝色果实组成 if(k-l>b[i]) continue; int num1=a[i]+j-l; int num2=sum-j-f[i-1][j]*k-a[i]-k+l; f[i][num1%k]=max(f[i][num1%k],f[i-1][j]+1+num1/k+num2/k); } int num1=j+a[i]; int num2=sum-a[i]-j-f[i-1][j]*k; f[i][num1%k]=max(f[i][num1%k],f[i-1][j]+num1/k+num2/k); } } ll ans=0; for(i=0;i<k;i++) ans=max(ans,f[n][i]); cout<<ans<<endl; return 0; }
以上是关于CF1348E Phoenix and Berries(dp)的主要内容,如果未能解决你的问题,请参考以下文章
CF1348D Phoenix and Science(思维)
[CF1348D] Phoenix and Science - 贪心
[CF1348D] Phoenix and Science - 贪心