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

猜你喜欢

转载自www.cnblogs.com/ctyakwf/p/13378516.html