CF1348E Phoenix and Berries(dp)
阿新 • • 發佈:2020-07-26
本質上是一個狀態機模型,因為對於每個來說,只有可能存在一個籃子是由同一堆中的不同顏色構成,否則都可以轉化為這一類。
因此我們列舉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);View Codeint 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; }