zoukankan      html  css  js  c++  java
  • 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
    没有人不辛苦,只有人不喊疼
  • 相关阅读:
    实验二
    2
    DS博客作业08--课程总结
    DS博客作业07--查找
    DS博客作业06--图
    DS博客园作业05--树
    有向图强连通分量Tarjan算法
    nyoj 题目737 合并石子(一)
    nyoj 题目61 传纸条
    nyoj 题目49 开心的小明
  • 原文地址:https://www.cnblogs.com/ctyakwf/p/13378516.html
Copyright © 2011-2022 走看看