1. 程式人生 > 實用技巧 >CF1348E Phoenix and Berries(dp)

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; }
View Code