UVa 1025 <DP>

来源:互联网 发布:苹果的乐器软件 编辑:程序博客网 时间:2024/06/05 01:01

the reason of failure:1、运行错误,原来是数组开小了,找了很多次都没找对,开始让车站数量的数组变大,结果是变错了。

2、判断是否该点该时列车的判断是错误的,虽然样例结果的对(一定要对输入进行判断,是否符合自己想的),刚开始f3=f2,但当第2趟列车开车为5分钟时,

f3的含义应该是列车运行了的时间,所以初始应该为0,否则在第一站,f3+f2就不是列车的发车时间了。

Q1:对列车在这点是否有向左或向右的数组没有写正确。

Q2:dp的状态转移方程中的时间与车站写反了

Q3:循环嵌套时候的变量都用了i

Q4:数组开小了。

题意是:给n个车站,每2个车站之间列车经过所用时间(从左到右与从右到左是相同的),然后给m1趟列车从1车站发车的时间,给m2趟列车从n车站发车的时间,

刚开始时间为0的时候在1车站,问T时间到n车站,这个人最少需要在站台上等待列车多长时间。

DP的方法,i时刻在j站台有3种方法:

1、i-1时刻就在j站台了,那么在原的基础上+1即可。

2、i-t[i-1]时刻在j-1站台,然后通过坐这趟火车过来(前提是有这么一列火车这个点开启),

3、i-t[i]时刻在j+1站台,然后通过坐火车过来的。

每个状态的变化都是由这3个状态变化得来,因此可以dp

AC代码:

#include <iostream>#include <string.h>#include <math.h>#include <stdio.h>#include <vector>#include <algorithm>#include <queue>using namespace std;const int INF=1e9+7;int t1[280];int train[1650][60][3];int dp[60][1650];//Q4int main(){//freopen("in.txt","r",stdin);int i,j,k,f1,f2,f3,f4,t4,t2,t3,n,m;int T,r,c;int res=0;while(scanf("%d",&n)==1&&n){res++;memset(train,0,sizeof(train));t1[0]=0;t1[n]=0;cin >> T;for(i=0;i<=n;i++)for(j=0;j<=T;j++)dp[i][j]=INF;dp[1][0]=0;for(i=1;i<n;i++)cin >> t1[i];cin >> f1;for(i=1;i<=f1;i++){cin >> f2;f3=0;for(j=1;j<n;j++){f3+=t1[j-1];train[f2+f3][j][0]=1; //Q1//cout << f2+f3 << "     从 " <<j <<endl;  }}cin >> f1;for(i=1;i<=f1;i++){cin >> f2;f3=0;for(j=n;j>1;j--){//Q3f3+=t1[j];train[f2+f3][j][1]=1;//cout << f2+f3 << "     ~~从 " <<j <<endl;  }} //数组越界会出现错误 //cout << train[30][3][1]<< endl;for(j=1;j<=T;j++)for(i=1;i<=n;i++){//Q2dp[i][j]=dp[i][j-1]+1; //i-车站,j-时间if(j-t1[i-1]>=0&&i-1>=1&&train[j-t1[i-1]][i-1][0]==1){dp[i][j]=min(dp[i][j],dp[i-1][j-t1[i-1]]);//cout << j-t1[i-1] << "时刻"<< j <<" 从" << i-1<< "   --到" << i << "     "//<<dp[i][j] <<endl;}if(j-t1[i]>=0&&i+1<=n&&train[j-t1[i]][i+1][1]==1){dp[i][j]=min(dp[i][j],dp[i+1][j-t1[i]]);//cout << j-t1[i] << "时刻"<< j << " 从" << i+1 <<"   ~~到" << i << //"     " << dp[i][j] << endl;}}//for(j=1;j<=T;j++)//for(i=1;i<=n;i++){//if(dp[i-1][j]<INF)//dp[i][j]=dp[i-1][j]+1;//if(j-1>=1&&i-t1[j-1]>=0&&train[i-t1[j-1]][j-1][0]==1)//dp[i][j]=min(dp[i][j],dp[i-t1[j-1]][j-1]);//if(j+1<=n&&i-t1[j]>=0&&train[i-t1[j]][j+1][1]==1)//dp[i][j]=min(dp[i][j],dp[i-t1[j-1]][j-1]);//}if(dp[n][T]<INF)printf("Case Number %d: %d\n",res,dp[n][T]);elseprintf("Case Number %d: impossible\n",res);}return 0;}


0 0
原创粉丝点击