UVA 1336 Fixing the Great Wall——dp
2018-03-23 16:51
417 查看
从紫书前面做过来的话就知道是老思路了,额外加个累计数组就好,另外精度卡的不是很严格,写起来可以随意一些#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 1010;
const int INF = 0x3f3f3f3f;
int n, v, X, p[maxn], sum[maxn][maxn][2];
double dp[maxn][maxn][2];
struct Node {
int x, c, t;
bool operator < (const Node &no) const {
return x < no.x;
}
}node[maxn];
void init() {
sort(node+1,node+1+n);
int s = 0;
for (int i = 1; i <= n; i++) s += node[i].t, p[i] = node[i].x;
for (int i=1;i<=n;i++) for (int j=1;j<=n;j++) dp[i][j][0]=dp[i][j][1]=INF;
int pos = lower_bound(p+1,p+1+n,X)-p;
if (node[pos].x == X) {
dp[pos][pos][0]=dp[pos][pos][1]=node[pos].c;
sum[pos][pos][0]=sum[pos][pos][1]=s-node[pos].t;
}
else {
dp[pos][pos][0]=dp[pos][pos][1]=1.0*(node[pos].x-X)/v*s+node[pos].c;
sum[pos][pos][0]=sum[pos][pos][1]=s-node[pos].t;
if (pos-1>=1) {
pos--;
dp[pos][pos][0]=dp[pos][pos][1]=1.0*(X-node[pos].x)/v*s+node[pos].c;
sum[pos][pos][0]=sum[pos][pos][1]=s-node[pos].t;
}
}
}
void update(int x1,int x2,int x3,int y1,int y2,int y3,int c1,double c2,int c3) {
if (dp[x1][x2][x3] > dp[y1][y2][y3]+c1+c2) {
dp[x1][x2][x3] = dp[y1][y2][y3]+c1+c2;
sum[x1][x2][x3] = sum[y1][y2][y3]-c3;
}
// else if (dp[x1][x2][x3] == dp[y1][y2][y3]+c1+c2) {
// sum[x1][x2][x3] = min(sum[x1][x2][x3],sum[y1][y2][y3]-c3);
// }
}
int main() {
while (~scanf("%d%d%d",&n,&v,&X)&&n+X+v) {
for (int i = 1; i <= n; i++) scanf("%d%d%d",&node[i].x,&node[i].c,&node[i].t);
init();
for (int len = 1; len < n; len++) {
for (int i = 1; i + len - 1 <= n; i++) {
int j = i+len-1;
double cost = 0.0;
if (dp[i][j][0] != INF) {
if (i-1 >= 1) {
cost = 1.0*(node[i].x-node[i-1].x)/v*sum[i][j][0];
update(i-1,j,0,i,j,0,node[i-1].c,cost,node[i-1].t);
}
if (j+1 <= n) {
cost = 1.0*(node[j+1].x-node[i].x)/v*sum[i][j][0];
update(i,j+1,1,i,j,0,node[j+1].c,cost,node[j+1].t);
}
}
if (dp[i][j][1] != INF) {
if (i-1 >= 1) {
cost = 1.0*(node[j].x-node[i-1].x)/v*sum[i][j][1];
update(i-1,j,0,i,j,1,node[i-1].c,cost,node[i-1].t);
}
if (j+1 <= n) {
cost = 1.0*(node[j+1].x-node[j].x)/v*sum[i][j][1];
update(i,j+1,1,i,j,1,node[j+1].c,cost,node[j+1].t);
}
}
}
}
printf("%d\n", (int)min(dp[1]
[0],dp[1]
[1]));
}
return 0;
}
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 1010;
const int INF = 0x3f3f3f3f;
int n, v, X, p[maxn], sum[maxn][maxn][2];
double dp[maxn][maxn][2];
struct Node {
int x, c, t;
bool operator < (const Node &no) const {
return x < no.x;
}
}node[maxn];
void init() {
sort(node+1,node+1+n);
int s = 0;
for (int i = 1; i <= n; i++) s += node[i].t, p[i] = node[i].x;
for (int i=1;i<=n;i++) for (int j=1;j<=n;j++) dp[i][j][0]=dp[i][j][1]=INF;
int pos = lower_bound(p+1,p+1+n,X)-p;
if (node[pos].x == X) {
dp[pos][pos][0]=dp[pos][pos][1]=node[pos].c;
sum[pos][pos][0]=sum[pos][pos][1]=s-node[pos].t;
}
else {
dp[pos][pos][0]=dp[pos][pos][1]=1.0*(node[pos].x-X)/v*s+node[pos].c;
sum[pos][pos][0]=sum[pos][pos][1]=s-node[pos].t;
if (pos-1>=1) {
pos--;
dp[pos][pos][0]=dp[pos][pos][1]=1.0*(X-node[pos].x)/v*s+node[pos].c;
sum[pos][pos][0]=sum[pos][pos][1]=s-node[pos].t;
}
}
}
void update(int x1,int x2,int x3,int y1,int y2,int y3,int c1,double c2,int c3) {
if (dp[x1][x2][x3] > dp[y1][y2][y3]+c1+c2) {
dp[x1][x2][x3] = dp[y1][y2][y3]+c1+c2;
sum[x1][x2][x3] = sum[y1][y2][y3]-c3;
}
// else if (dp[x1][x2][x3] == dp[y1][y2][y3]+c1+c2) {
// sum[x1][x2][x3] = min(sum[x1][x2][x3],sum[y1][y2][y3]-c3);
// }
}
int main() {
while (~scanf("%d%d%d",&n,&v,&X)&&n+X+v) {
for (int i = 1; i <= n; i++) scanf("%d%d%d",&node[i].x,&node[i].c,&node[i].t);
init();
for (int len = 1; len < n; len++) {
for (int i = 1; i + len - 1 <= n; i++) {
int j = i+len-1;
double cost = 0.0;
if (dp[i][j][0] != INF) {
if (i-1 >= 1) {
cost = 1.0*(node[i].x-node[i-1].x)/v*sum[i][j][0];
update(i-1,j,0,i,j,0,node[i-1].c,cost,node[i-1].t);
}
if (j+1 <= n) {
cost = 1.0*(node[j+1].x-node[i].x)/v*sum[i][j][0];
update(i,j+1,1,i,j,0,node[j+1].c,cost,node[j+1].t);
}
}
if (dp[i][j][1] != INF) {
if (i-1 >= 1) {
cost = 1.0*(node[j].x-node[i-1].x)/v*sum[i][j][1];
update(i-1,j,0,i,j,1,node[i-1].c,cost,node[i-1].t);
}
if (j+1 <= n) {
cost = 1.0*(node[j+1].x-node[j].x)/v*sum[i][j][1];
update(i,j+1,1,i,j,1,node[j+1].c,cost,node[j+1].t);
}
}
}
}
printf("%d\n", (int)min(dp[1]
[0],dp[1]
[1]));
}
return 0;
}
相关文章推荐
- UVA-1336 Fixing the Great Wall(区间DP)
- UVa 1336 Fixing the Great Wall (区间DP)
- Fixing the Great Wall UVA - 1336(区间dp+前缀和)
- UVA 1336 Fixing the Great Wall(区间DP)
- UVA - 1336 Fixing the Great Wall 记忆化搜索
- UVa #1336 Fixing the Great Wall (例题9-21)
- uva 1336 - Fixing the Great Wall 修缮长城
- 1336 - Fixing the Great Wall(DP)
- 100道动态规划——18 UVA 1336 Fixing the Great Wall 指标函数的分解,刷表法
- Fixing the Great Wall UVA - 1336
- UVA 1336 Fixing the Great Wall - ACM/ICPC CERC 2004
- UVA 1336 Fixing the Great Wall
- 区间DP(修缮长城,uva 1336)
- UVa1336 Fixing the Great Wall
- Uva-1336-Fixing the Great Wall
- Uva1336 修长城 【有关未来费用的区间dp】
- 【Uva 1336】Fixing the Great Wall
- uva 1336 - Fixing the Great Wall
- uva 10671 - Grid Speed(dp)
- uva 10306 简单DP