| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
请问下谁有这道题DP的标程啊~我自己的DP老wa~~//我的DP,测试N组数据正确,但没过。。。。
//假设在第i个湖完成钓鱼,分别DP到第i个湖。求最大的钓鱼数目
#include<iostream>
using namespace std;
#define GETMAX(a,b) ((a)>(b)?(a):(b))
int main(){
int n,h,time,fi[30],di[30],ti[30],g[30],f[1000],q[1000][30],b[30],i,j,k,maxj,maxk,max,p,sum,firstmax;
while(1){
cin>>n;
if(n==0) break;
cin>>h;
time=h*60/5;
for(i=1;i<=n;++i) cin>>fi[i];
for(i=1;i<=n;++i) cin>>di[i];
for(i=1;i<n;++i) cin>>ti[i];
g[1]=0;
for(i=2;i<=n;++i) g[i]=g[i-1]+ti[i-1];
memset(f,-1,sizeof(f));f[0]=0;
memset(q,0,sizeof(q));
memset(b,0,sizeof(b));
max=0;maxj=0;maxk=1;firstmax=0;
//开始DP,类似背包的方式
for(i=1;i<=n;++i){
for(j=time;j>=0;--j){
p=0;sum=0;
do{
sum=sum+fi[i]-di[i]*(p++);
if(j-p<0) break;
if(f[j-p]>=0){
if(f[j-p]+sum>f[j]){
for(k=1;k<=n;++k) q[j][k]=q[j-p][k];
q[j][i]=p;
}
f[j]=GETMAX(f[j],f[j-p]+sum);
}
}while(fi[i]-di[i]*p>0);
}
//完成到第i个湖的DP,每个湖DP完立马统计是为了消除后面DP的影响,下面计算开始统计
for(j=time-g[i];j>=0;--j){
for(k=n;k>=1;--k)
if(q[j][k]>0) break;
if(f[j]!=-1 && k==i){
if(max<f[j]){
max=f[j];maxj=j;maxk=k;
for(k=1;k<=n;++k) b[k]=q[j][k];
break;
}
else if(max==f[j]){
if(firstmax<q[j][1]+time-j-g[k]){
firstmax=q[j][1]+time-j-g[k];
max=f[j];maxj=j;maxk=k;
for(k=1;k<=n;++k) b[k]=q[j][k];
}
}
}
}
}
cout<<(b[1]+time-maxj-g[maxk])*5;
for(i=2;i<=n;++i) cout<<", "<<b[i]*5;
cout<<endl<<"Number of fish expected: "<<max<<endl<<endl;
}
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator