爱嘉牛LA

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

 

问题:

某旅游城市在长江边开辟了若干个旅游景点。一个游船俱乐部在这些景点都设置了游船出租站,游客可在泽泻游船出租站租用游船,并在下游的任何一个游船出租站归还游船,从一个悠长出租站到下游的游船出租站间的租金明码标价。你的任务是为游客计算从起点站到终点之间的最少租船费用。

输入样例

3

2 3 6 //从起点到第1 ,2 ,3个站的租金,下同

1 3

2

自底向上的动态规划算法:

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(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;
}

 

View Code
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;
}
View Code
#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;
}

 

View Code
#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;
}
posted on 2012-08-04 21:38  爱嘉牛LA  阅读(741)  评论(0编辑  收藏  举报