问题:
某旅游城市在长江边开辟了若干个旅游景点。一个游船俱乐部在这些景点都设置了游船出租站,游客可在泽泻游船出租站租用游船,并在下游的任何一个游船出租站归还游船,从一个悠长出租站到下游的游船出租站间的租金明码标价。你的任务是为游客计算从起点站到终点之间的最少租船费用。
输入样例
3
2 3 6 //从起点到第1 ,2 ,3个站的租金,下同
1 3
2
自底向上的动态规划算法:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<iostream> using namespace std; const int MAXM=100; int n,r[MAXM][MAXM],money[MAXM][MAXM]; void moneyDP(int rr[MAXM][MAXM],int mm[MAXM][MAXM],int nn){ int i,j,num=0,tmp=0,t; for(i=0;i<nn;i++) for(j=i+1;j<=nn;j++) mm[i][j]=rr[i][j];//赋初值 for(i=0;i<=nn;i++) mm[i][i]=0; //主要算法 for(t=2;t<=nn;t++) for(i=0;i<=nn-t;i++){ tmp=rr[i][t+i]; for(j=i+1;j<t+i;j++) if(tmp>mm[i][j]+mm[j][i+t]) tmp=mm[i][j]+mm[j][i+t]; mm[i][i+t]=tmp; } } int main(){ int i,j,num=0,a; while(cin>>n){ if(n==0) break; else{ num++; for(i=0;i<n;i++) for(j=i+1;j<=n;j++){ cin>>a; r[i][j]=a; } moneyDP(r,money,n); cout<<"Case "<<num<<":"<<endl; cout<<money[0][n]<<endl; } } return 0; }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
View Code #include<iostream> using namespace std; const int MAXM=100; int n,r[MAXM][MAXM],money[MAXM][MAXM]; void moneyDP(int rr[MAXM][MAXM],int mm[MAXM][MAXM],int nn){ int i,j,num=0,tmp=0,t; for(i=0;i<nn;i++) for(j=i+1;j<=nn;j++) mm[i][j]=rr[i][j];//赋初值 for(i=0;i<=nn;i++) mm[i][i]=0; //主要算法 我自己写 for(i=0;i<n;i++){ for(j=i+2;j<=n;j++){ for(int k=i+1;k<j;k++){ tmp=mm[i][j]; if(tmp>mm[i][k]+mm[k][j]) mm[i][j]=mm[i][k]+mm[k][j]; } } } } int main(){ int i,j,num=0,a; while(cin>>n){ if(n==0) break; else{ num++; for(i=0;i<n;i++) for(j=i+1;j<=n;j++){ cin>>a; r[i][j]=a; } moneyDP(r,money,n); cout<<"Case "<<num<<":"<<endl; cout<<money[0][n]<<endl; } } return 0; }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<iostream> using namespace std; const int MAXM=100; int n,r[MAXM][MAXM],money[MAXM]; //更简洁的算法,用m[]来存储最少租金 void moneyDP(int rr[MAXM][MAXM],int m[],int nn){ for(int i=1;i<=nn;i++){ m[i]=r[0][i]; for(int j=i-1;j>0;j--){ if(m[i]>m[j]+rr[j][i]) m[i]=m[j]+rr[j][i]; } } } int main(){ int i,j,num=0,a; while(cin>>n){ if(n==0) break; else{ num++; for(i=0;i<n;i++) for(j=i+1;j<=n;j++){ cin>>a; r[i][j]=a; } moneyDP(r,money,n); cout<<"Case "<<num<<":"<<endl; cout<<money[n]<<endl; } } return 0; }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<iostream> using namespace std; const int MAXM=100; int n,r[MAXM][MAXM],m[MAXM][MAXM]; int money(int i,int j){ int k,tmp=0,u; if(i==j) return 0; if(i+1==j) return r[i][j]; u=m[i][j]; for(int k=i+1;k<j;k++){ tmp=money(i,k)+money(k,j); if(tmp<u) u=tmp; } return u; } int main(){ int i,j,num=0,a; while(cin>>n){ if(n==0) break; else{ num++; cout<<"Case "<<num<<":"<<endl; for(i=0;i<n;i++) for(j=i+1;j<=n;j++){ cin>>a; r[i][j]=a; if(a==-1) r[i][j]=65535; m[i][j]=r[i][j]; } money(0,n); cout<<money(0,n)<<endl; } } return 0; }