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
- UVA 1025 DP
- UVa 1025 <DP>
- UVA DP 入门专题
- uva 1424 简单DP
- uva 10192 DP
- UVA dp题目汇总
- UVa 4256 - Salesmen dp
- UVa 10271 - Chopsticks dp
- UVA 1424 - Salesmen (dp)
- uva 672 Gangsters( dp )
- UVA 10271 Chopsticks(dp)
- uva 10271 Chopsticks(dp)
- UVA 11584 DP水题
- UVA 1424 DP水题
- UVA 10534 DP+LIS
- UVA 11552 DP水题
- UVA 1456 DP水题
- Uva 624 背包DP
- Spring注解事务失效
- SICP 1.22
- Android开发之Android Studio开发工具项目创建和共享
- springmvc入门案例
- sql查询中,增加序号
- UVa 1025 <DP>
- ehcache 3 配置文件
- 两个栈实现队列,两个队列实现栈
- Handler sendMessageDelayed()/postDelayed()机制详解
- IEEE802.11协议基础
- BZOJ4205: 卡牌配对
- 对于循环行列结算
- Gambling in Japan: In a Spin
- I/O多路复用机制(二)