CF cut ribbon

来源:互联网 发布:政府网络舆情管理 编辑:程序博客网 时间:2024/06/08 05:21

题意大概是:一段长为n的丝带,将它分成a,b,c(可以相等)的几段,让输出能分成的最大段数。

简单DP

分析:长为n的丝带的最大分段,可以分解为3个相互重叠的子问题,即:长为n-a的丝带的最大分段,长为n-b,长为n-c。同时这三个子问题有可以分成相互重叠的子问题,依次类推。可以将长度为n的丝带分成n段,每段分别记录可分的最大段数,即数组f[n];

约束条件:1<=n,a,b,c<=4000

分析可得f [ i ] = max ( f [ i ] , f [ i - j ] + f [ j ] ),取在j这个位置不切和切中的最大值。

代码如下:

#include<iostream>#include<cstring>#include<cstdio>#include<algorithm>using namespace std;int n,a,b,c;int f[4005];int main(){    cin>>n>>a>>b>>c;    memset(f,0,sizeof(f));    f[a]=f[b]=f[c]=1;    for(int i=1;i<=n;i++)    {        for(int j=1;j<=i;j++)        {            if(f[i-j]&&f[j])            {                f[i]=max(f[i],f[i-j]+f[j]);            }        }    }    cout<<f[n]<<endl;}

0 0