DP源程序.docx
- 文档编号:29249243
- 上传时间:2023-07-21
- 格式:DOCX
- 页数:45
- 大小:24.44KB
DP源程序.docx
《DP源程序.docx》由会员分享,可在线阅读,更多相关《DP源程序.docx(45页珍藏版)》请在冰豆网上搜索。
DP源程序
1024
/*
经典的动态规划优化的问题。
设f(i,j)表示前i个数划分成j段,且包括第i个数的最大m子段和,那么有dp方程:
f(i,j)=max{f(i-1,j)+v[i],max{f(k,j-1)+v[i]}(k=j-1...i-1)}
可以引入一个辅助数组来优化转移。
设g(i,j)表示前i个数划分成j段的最大子段和(注意第i个数未必在j段里面),那么递推关系如下:
g(i,j)=max{g(i-1,j),f(i,j)},
分是否加入第i个数来转移
这样f的递推关系就变成:
f(i,j)=max{f(i-1,j),g(i-1,j-1)}+v[i],转移变成了O
(1)
这样最后的结果就是g[n][m],通过引入辅助数组巧妙的优化了转移。
实现的时候可以用一维数组,速度很快
g[i][j]要么和g[i-1][j]相等,要么和f[i][j]相等
f[i][j]-a[i]要么和g[i-1][j-1]相等,要么和f[i-1][j]相等
转成一维数组到第i行时:
f[j]=max{f[j],g[j-1]}+a[i]
g[j]=max{g[j],f[j]};
*/
#include
usingnamespacestd;
intn,m;
constintN=1000001;
constintMin=-99999999;
intF[N],G[N];
inta[N];
intMax_num(inta,intb)
{
if(a>b)
returna;
elsereturnb;
}
intMin_num(inta,intb)
{
if(a
returna;
elsereturnb;
}
intmain()
{
inti,j;
while(scanf("%d%d",&m,&n)!
=EOF&&n&&m)
{
for(i=1;i<=n;i++)
{
F[i]=Min;
G[i]=Min;
cin>>a[i];
}
F[1]=a[1];
G[1]=a[1];
for(i=2;i<=n;i++)
{
intt=Min_num(i,m);
for(j=1;j<=t;j++)
{
F[j]=Max_num(F[j]+a[i],G[j-1]+a[i]);
G[j-1]=Max_num(G[j-1],F[j-1]);
}
G[j-1]=Max_num(G[j-1],F[j-1]);
}
cout< } return0; } 1069 #include #include #include #include usingnamespacestd; structrectangular{ intlength; intwidth; intheight; intarea; }aa[205]; boolcmp1(inta,intb){ returna>b; } boolcmp2(rectangulara,rectangularb){ returna.area>b.area; } intmain(){ //freopen("4.txt","r",stdin); intn; intcount=1; while(scanf("%d",&n)&&n){ intnum[3],dp[205]; for(inti=1;i<=6*n;i+=6){ for(intj=0;j<3;++j) scanf("%d",&num[j]); sort(num,num+3,cmp1); aa[i].length=num[0];aa[i].width=num[1];aa[i].height=num[2];aa[i].area=aa[i].length*aa[i].width; aa[i+1].length=num[1];aa[i+1].width=num[2];aa[i+1].height=num[0];aa[i+1].area=aa[i+1].length*aa[i+1].width; aa[i+2].length=num[2];aa[i+2].width=num[0];aa[i+2].height=num[1];aa[i+2].area=aa[i+2].length*aa[i+2].width; aa[i+3].length=num[1];aa[i+3].width=num[0];aa[i+3].height=num[2];aa[i+3].area=aa[i+3].length*aa[i+3].width; aa[i+4].length=num[2];aa[i+4].width=num[1];aa[i+4].height=num[0];aa[i+4].area=aa[i+4].length*aa[i+4].width; aa[i+5].length=num[0];aa[i+5].width=num[2];aa[i+5].height=num[1];aa[i+5].area=aa[i+5].length*aa[i+5].width; } sort(aa+1,aa+6*n,cmp2); for(inti=1;i<=6*n;++i) dp[i]=aa[i].height; for(inti=2;i<=6*n;++i){ intxmax=0; for(intj=1;j if((aa[j].length>aa[i].length&&aa[j].width>aa[i].width)||(aa[j].length>aa[i].width&&aa[j].width>aa[i].length)) if(dp[j]>xmax) xmax=dp[j]; } dp[i]=xmax+aa[i].height; } intymax=0; for(inti=1;i<=6*n;++i) if(dp[i]>ymax) ymax=dp[i]; printf("Case%d: maximumheight=%d\n",count++,ymax); } return0; } 1074 #include #include #include usingnamespacestd; typedefstruct_homework { charname[102]; intdeadline; intneedday; }homework; homeworkhwk[16]; intn; typedefstruct_DP { intndday; intpre; intlowcost; }DP; DPdp[1<<15]; boolvisited[1<<15]; voidoutput(intstatus) { intcurwk=dp[status].pre^status; intcurid=0; curwk>>=1; while(curwk){ curid++; curwk>>=1; } if(dp[status].pre! =0){ output(dp[status].pre); } printf("%s\n",hwk[curid].name); } intmain() { freopen("input.txt","r",stdin); intt,i,j; intupper,cur,curtmp,reduce; scanf("%d",&t); while(t--){ scanf("%d",&n); for(i=0;i scanf("%s%d%d",hwk[i].name,&hwk[i].deadline,&hwk[i].needday); } memset(visited,false,sizeof(visited)); upper=(1< dp[0].ndday=0,dp[0].lowcost=0,dp[0].pre=-1; visited[0]=true; for(i=0;i for(j=0;j cur=1< if((cur&i)==0){ curtmp=cur|i; dp[curtmp].lowcost=dp[i].lowcost+hwk[j].needday; reduce=dp[curtmp].lowcost-hwk[j].deadline; if(reduce<0)reduce=0; reduce+=dp[i].ndday; if(visited[curtmp]){ if(reduce dp[curtmp].ndday=reduce; dp[curtmp].pre=i; } } else{ visited[curtmp]=true; dp[curtmp].ndday=reduce; dp[curtmp].pre=i; }//else }//if }//for }//for printf("%d\n",dp[upper].ndday); output(upper); }//while return0; } 1074 #include #include #include usingnamespacestd; typedefstruct_homework { charname[102]; intdeadline; intneedday; }homework; homeworkhwk[16]; intn; typedefstruct_DP { intndday; intpre; intlowcost; }DP; DPdp[1<<15]; boolvisited[1<<15]; voidoutput(intstatus) { intcurwk=dp[status].pre^status; intcurid=0; curwk>>=1; while(curwk){ curid++; curwk>>=1; } if(dp[status].pre! =0){ output(dp[status].pre); } printf("%s\n",hwk[curid].name); } intmain() { freopen("input.txt","r",stdin); intt,i,j; intupper,cur,curtmp,reduce; scanf("%d",&t); while(t--){ scanf("%d",&n); for(i=0;i scanf("%s%d%d",hwk[i].name,&hwk[i].deadline,&hwk[i].needday); } memset(visited,false,sizeof(visited)); upper=(1< dp[0].ndday=0,dp[0].lowcost=0,dp[0].pre=-1; visited[0]=true; for(i=0;i for(j=0;j cur=1< if((cur&i)==0){ curtmp=cur|i; dp[curtmp].lowcost=dp[i].lowcost+hwk[j].needday; reduce=dp[curtmp].lowcost-hwk[j].deadline; if(reduce<0)reduce=0; reduce+=dp[i].ndday; if(visited[curtmp]){ if(reduce dp[curtmp].ndday=reduce; dp[curtmp].pre=i; } } else{ visited[curtmp]=true; dp[curtmp].ndday=reduce; dp[curtmp].pre=i; }//else }//if }//for }//for printf("%d\n",dp[upper].ndday); output(upper); }//while return0; } 1087 #include #include #include usingnamespacestd; intmain(){ //freopen("4.txt","r",stdin); intn,num[1005],dp[1005]; while(scanf("%d",&n)&&n){ for(inti=1;i<=n;++i) scanf("%d",&num[i]); memset(dp,0,sizeof(dp)); dp[1]=num[1]; intxmax; for(inti=2;i<=n;++i){ xmax=0; for(intj=1;j if(num[j] if(dp[j]>xmax) xmax=dp[j]; } } if(xmax==0) dp[i]=num[i]; else dp[i]=xmax+num[i]; } xmax=0; for(inti=1;i<=n;++i) if(xmax xmax=dp[i]; printf("%d\n",xmax); } return0; } 1114 #include usingnamespacestd; constintINF=0xfffffff; structQ { intp;//价值 intw;//重量 }; intdp[10005]; voidCompleteBack(Qq[],intV,intn) { inti,v; dp[0]=0; for(i=1;i<=V;i++) dp[i]=INF; for(i=0;i for(v=q[i].w;v<=V;v++) if(dp[v]>dp[v-q[i].w]+q[i].p) dp[v]=dp[v-q[i].w]+q[i].p; } intmain() { intt,e,f,i,n,v,res; scanf("%d",&t); while(t--) { Qq[505]; scanf("%d%d",&e,&f); v=f-e; scanf("%d",&n); for(i=0;i scanf("%d%d",&q[i].p,&q[i].w); CompleteBack(q,v,n); if(dp[v]==INF) printf("Thisisimpossible.\n"); else printf("Theminimumamountofmoneyinthepiggy-bankis%d.\n",dp[v]); } return0; } 1159 #include #include #definemax(a,b)a>b? a: b; intf[500][500]; intmain() { inti,j,la,lb; chara[500],b[500]; while(scanf("%s%s",a,b)! =EOF) { la=strlen(a); lb=strlen(b); for(i=1;i<=la;i++) { f[i][0]=0; f[0][i]=0; } for(i=1;i<=la;i++) for(j=1;j<=lb;j++) { if(a[i-1]==b[j-1]) f[i][j]=f[i-1][j-1]+1; else f[i][j]=max(f[i-1][j],f[i][j-1]); } printf("%d\n",f[la][lb]); } return0; } 1160 #include usingnamespacestd; #include structMou { intw; intnum; ints; intnext; }mou[1005]; intmain() { inti=0,j,k,sum,t,max,n,m1,d[1005]; Moua; intb[1005],c[1005]; while(scanf("%d%d",&mou[i].w,&mou[i].s)! =EOF) { i++; } max=1; sum=1; m1=0; k=i; t=0; for(i=0;i<1005;i++) b[i]=1; for(j=0;j mou[j].num=j+1; for(i=0;i for(j=i+1;j { if(mou[i].w>mou[j].w) { a=mou[i]; mou[i]=mou[j]; mou[j]=a; } elseif(mou[i].w==mou[j].w) { if(mou[i].s { a=mou[i]; mou[i]=mou[j]; mou[j]=a; } } } for(i=0;i { for(j=0;j { if(mou[i].w>mou[j].w&&mou[i].s { b[i]=b[j]+1; mou[i].next=j; } if(b[i]>max) { max=b[i]; m1=i; } } } cout< for(i=0;i { c[i]=mou[m1].num; m1=mou[m1].next; } for(i=max-1;i>=0;i--) cout< return0; } 1171 #include #include #include usingnamespacestd; structgood{ intvalue; intnum; }aa[55]; intsum,total,dp[150000]; intmax(inta,intb){ returna>b? a: b; } voidfull_bag(intx) { for(intv=aa[x].value;v<=total;++v) dp[v]=max(dp[v],dp[v-aa[x].value]+aa[x].value); } voidone_zerobag(intx) { for(inti=1;i<=aa[x].num;++i) { for(intv=total;v>=aa[x].value;v--) dp[v]=max(dp[v],dp[v-aa[x].value]+aa[x].value); } } intmain(){ //freopen("4.txt","r",stdin); intn; while(scanf("%d",&n)&&n>0) { sum=0; for(inti=1;i<=n;++i){ scanf("%d%d",&aa[i].value,&aa[i].num); sum+=(aa[i].value*aa[i].num); } total=sum/2; memset(dp,0,sizeof(dp)); for(inti=1;i<=n;++i){ if(aa[i].num*aa[i].value>=total) full_bag(i); else one_zerobag(i); } printf("%d%d\n",sum-dp[total],dp[total]); } return0; } 1176 #include usingnamespacestd; intdp[11][1000
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- DP 源程序