区间dp。杭电上这题果然过不了,不知道那些A了的是怎么A的。。对于区间[ l , r ]一定是从最左边或者从最右边开始按的,因为假如从中间任意位置 k 开始按的话,一定要按最左边的那个,也一定要按最右边的那个,这样的话一定会经过 k ,这样的话,对于 k 来说这样一定不是最优解。于是问题就转化为了区间dp了。可以用dp[ l ][ r ][0] 表示从左边开始按,把区间走完需要多长时间(要满足时间条件t [ i ])。dp[ l ][ r ][1] 表示从右边开始按,把区间走完需要多长时间(要满足时间条件t
[ i ])。这样的话有状态转移方程:
dp[ l ][ r ][0] = min(dp[l + 1][r][0] + d[l + 1] - d[l],dp[l + 1][r][1] + d[r] - d[l]);
dp[ l ][ r ][1] = min(left = dp[l][r - 1][0] + d[r] - d[l,dp[l][r - 1][1] + d[r] - d[r - 1]);
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#define LL long long
#define CLR(a, b) memset(a, b, sizeof(a))
using namespace std;
const int N = 222;
const LL INF = 1e18;
LL dp[N][N][2];
int path[N][N][2];
int t[N], d[N];
int main()
{
int n, i, l, r, f;
LL left, right;
while(scanf("%d", &n) != EOF)
{
for(i = 1; i <= n; i ++)
{
scanf("%d", &t[i]);
}
for(i = 1; i <= n; i ++)
{
scanf("%d", &d[i]);
}
CLR(dp, 0);
for(i = 1; i < n; i ++)
{
for(l = 1; i + l <= n; l ++)
{
r = i + l;
left = dp[l + 1][r][0] + d[l + 1] - d[l];
right = dp[l + 1][r][1] + d[r] - d[l];
if(left < right)
{
dp[l][r][0] = left;
path[l][r][0] = 0;
}
else
{
dp[l][r][0] = right;
path[l][r][0] = 1;
}
if(t[l] <= dp[l][r][0]) dp[l][r][0] = INF;
left = dp[l][r - 1][0] + d[r] - d[l];
right = dp[l][r - 1][1] + d[r] - d[r - 1];
if(left < right)
{
dp[l][r][1] = left;
path[l][r][1] = 0;
}
else
{
dp[l][r][1] = right;
path[l][r][1] = 1;
}
if(t[r] <= dp[l][r][1]) dp[l][r][1] = INF;
}
}
l = 1; r = n;
if(dp[1][n][0] < INF)
{
f = path[1][n][0];
printf("%d", l ++);
}
else if(dp[1][n][1] < INF)
{
f = path[1][n][1];
printf("%d", r --);
}
else
{
puts("Mission Impossible");
continue;
}
while(l <= r)
{
if(f == 0)
{
f = path[l][r][0];
printf(" %d", l ++);
}
else
{
f = path[l][r][1];
printf(" %d", r --);
}
}
puts("");
}
}
分享到:
相关推荐
zoj 3019 Puzzle.md
zoj 1255 The Path.md
zoj 1810 The Gourmet Club.md
zoj 2499 The Happy Worm.md
zoj 2151 The Highest Profits.md
ZOJ解题报告ZOJ解题报告ZOJ解题报告ZOJ解题报告
zoj 1610 Count the Colors.md
zoj题目简单归类zoj题目简单归类zoj题目简单归类
acm中zoj1002的可运行C++程序
包含了zoj700多道题目的源代码,在做题时可以参考
Problem Arrangement zoj 3777
ZOJ题目答案源码
一个非常非常非常非常实用的zoj结题代码
学习ACM程序设计的朋友一定要看,这是训练必备的POJ ZOJ题目分类及解题思路
The reason is that when the director chooses the words from the dictionary and encrypts them, he never changes their order (the words in the dictionary are lexicographically sorted). String a1a2 ... ...
ZOJ1805代码
zoj 1003 c语言的,要写这么多描述吗。。
本代码是zoj上AC的1951的代码,把双重循环简化为O(n),不过素数判断的改进还不够
zoj1027解题指南和代码,还不错,是学校培训给的。
浙大ZOJ题目分类,可以让你更方便快速锁定那你想要联系的题目,是自己快速提高·