您的位置:首页 > 其它

A Spy in the Metro(Uva1025,2003WorldFinal)(DP)

2018-02-03 18:49 561 查看
时间是单向流逝的,是一个天然的“序”。 影响到决策的只有当前时间和所处的车站,所
以可以用d(i,j)表示时刻i,你在车站j(编号为1~n),最少还需要等待多长时间。
边界条件

是d(T,n)=0,其他d(T,i)(i不等于n)为正无穷。
有如下3种决策。

决策1:等1分钟。

决策2:搭乘往右开的车(如果有)。

决策3:搭乘往左开的车(如果有)。

(来自《算法竞赛入门经典》)

我还是菜,,,,

刚读题真是一脸懵逼,真是难,无从下手,不知道怎么剖分问题,我试着分析刘汝佳的话:

1.找到影响决策的条件。

2.分析问题,找到决策的所有可能发展方向。

3.注意边界条件。

4.题目给出的条件要有效的转化。(has_train数组的建立)

//final 2003
#include <bits/stdc++.h>
using namespace std;
#define INF 100000000

int main()
{
int N, T, t[51], M1, d[51], M2, c[51];
int dp[201][51];
bool has_train[201][51][2];
int Case = 0;

while(scanf("%d", &N), N)
{
memset(has_train, 0, sizeof(has_train));
memset(dp, 0, sizeof(dp));
scanf("%d", &T);

for(int i = 1; i < N; i++){
scanf("%d", &t[i]
937d
);
}

scanf("%d", &M1);
for(int i = 1; i <= M1; i++){
scanf("%d", &d[i]);
}
scanf("%d", &M2);
for(int i = 1; i <= M2; i++){
scanf("%d", &c[i]);
}

int time;
for(int i = 1; i <= M1; i++){
time = d[i];
for(int j = 1; j <= N; j++){
has_train[time][j][0] = true;
time += t[j];
}
}
for(int i = 1; i <= M2; i++){
time = c[i];
for(int j = N; j >= 1; j--){
has_train[time][j][1] = true;
time += t[j - 1];
}
}

//    for(int i = 0; i <= T; i++)
//      for(int j = 1; j <= N; j++)
//    printf("%d %d %c", has_train[i][j][0], has_train[i][j][1], j == N?'\n':' ');

for(int i = 1; i < N; i++)
dp[T][i] = INF;
dp[T]
= 0;

for(int i = T - 1; i >= 0; i--){
for(int j = 1; j <= N; j++){
dp[i][j] = dp[i + 1][j] + 1;
if(j < N && has_train[i][j][0] && i + t[j] <= T)
dp[i][j] = min(dp[i][j], dp[i+t[j]][j+1]); //右
if(j > 1 && has_train[i][j][1] && i + t[j - 1] <= T)
dp[i][j] = min(dp[i][j], dp[i+t[j-1]][j-1]); //左
}
}

printf("Case Number %d: ", ++Case);
if(dp[0][1] >= INF)
printf("impossible\n");
else
printf("%d\n", dp[0][1]);
}

return 0;
}


懒得写注释了。。。。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: