uva_10201 adventure_in_moving dp

来源:互联网 发布:网络yy骗小钱 编辑:程序博客网 时间:2024/06/04 19:05
//uva_10201 adventure_in_moving //输入://1////500//100 999//150 888//200 777//300 999//400 1009//450 1019//500 1399//////1 为输入数据的次数 和500之间有空格 500为路径的长度//接下来7行 每行有2个数字  第一个数字表示加油站的位置 第二个数表示加油站加一升油的钱//输出://450550////为450550最小的花费//题目大意://车从0开始到输入的结束位置(上次输入为500)开始时车上有100L汽油 1L汽油可以行使1公里//车最多一次可以装200L汽油 可以在输入的加油站位置加油 则从0位置行使到终点位置时车上还至少有//100L汽油 则至少需要多少钱//解题思路 ://动态规划  用dp[i][j]表示 在第i个加油站 车上还留有jL的汽油最少需要的钱 //          d[i]表示第i个加油站的位置 p[i]表示第i个加油站的价格//          则在第i个加油站有两种情况//          不在第i个加油站加油 dp[i][j]=dp[i-1][j+d[i]-d[i-1]];(0<=j+d[i]-d[i-1]<=200)//          在第i个加油站加油kL(0=<K<=j) dp[i][j]=dp[i-1][j-k+d[i]-d[i-1]]+k*p[i]; (j-k+d[i]-d[i-1])//          则状态转换方程为 dp[i][j]=min{dp[i-1][j+d[i]-d[i-1]],dp[i-1][j-k+d[i]-d[i-1]]+k*p[i]}(0<=k<=j)#include <iostream>#include <sstream>#include <algorithm>using namespace std;const int STATIONMAX=110;const int GASMAX=210;int main(int argc,char *argv[]){    int times,length,dp[STATIONMAX][GASMAX],d[STATIONMAX],p[STATIONMAX],stationnum;    int INF=(1<<30);    string line;    cin>>times;    while(times--)    {        stationnum=1;        cin>>length;        cin.ignore(1000,'\n');        while(getline(cin,line)&&(line.length()>0))        {            istringstream iss(line);            iss>>d[stationnum]>>p[stationnum];            stationnum++;        }        stationnum--;        for(int i=0;i<=stationnum;i++)            for(int j=0;j<=200;j++)                dp[i][j]=INF;        d[0]=0;//0号站台的位置为0位置        dp[0][100]=0;        for(int i=1;i<=stationnum;i++)            for(int j=0;j<=200;j++)            {                int dist=d[i]-d[i-1];                if(j+dist>=0&&j+dist<=200)                dp[i][j]=dp[i-1][j+dist];                for(int k=0;k<=j;k++)                {                    if(j+dist-k>=0&&j+dist-k<=200)                    {                        if(dp[i][j]>(dp[i-1][j+dist-k]+k*p[i]))                            dp[i][j]=dp[i-1][j+dist-k]+k*p[i];                    }                }            }        if(length-d[stationnum]+100>200||dp[stationnum][length-d[stationnum]+100]==INF)            cout<<"Impossible"<<endl;        else cout<<dp[stationnum][length-d[stationnum]+100]<<endl;        if(times)            cout<<endl;    }}

在做这道题的时候发现自己不怎么细心 因为题目要求每两个答案之间是要有一个空行的 而且最后一个答案不能有空行 否则就会判错

0 0
原创粉丝点击