uva 1336 修长城 dayly training dp

本文探讨了一种基于动态规划的算法实现方案,通过具体的竞赛编程案例,详细讲解了如何运用预处理技巧解决复杂的问题。文章重点介绍了使用双精度浮点数进行精确计算的方法,并通过代码示例展示了如何优化成本函数的计算过程。

这道题说是像那个color length  一样可以类似预处理的方式。。。

还学了用floor函数。。。

如果是要整数的话 ,就直接%。0f就可以了,,


然而自己不知道为什么基本是照着敲的,还是样例都错了。。

不过要注意什么时候 哪些东西最好一开始就弄double

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<string>
#include<cstring>
#include<iomanip>
#include<iostream>
#include<stack>
#include<cmath>
#include<map>
#include<vector>
#define ll long long
#define inf 0x3f3f3f3f
#define INF 10000000000000
#define bug1 cout<<"bug1"<<endl;
#define bug2 cout<<"bug2"<<endl;
#define bug3 cout<<"bug3"<<endl;
using namespace std;
#define sf scanf
double v,sx;
int n;
const int maxn=1005;
//2017-4-17 09:56:47
double d[maxn][maxn][2];
int vis[maxn][maxn][2];
double psdt[maxn];
struct Node{
    double  x,c,dt;
    bool friend operator <(Node a,Node b){
        return a.x<b.x;
    }
}node[maxn];
double cost(double x1,double x2,int i,int j){
    double finished=0;
    if(i>=0&&j>=0)finished+=psdt[j]-psdt[i-1];//这个地方表达的意思挺好的。。
    return (psdt[n]-finished)*fabs(x2-x1)/v;//这个地方就是类似color的地方。
}
double dp(int i,int j,int p){
    if(i==1&&j==n)return 0;
    double &ans=d[i][j][p];
    if(vis[i][j][p])return ans;
    vis[i][j][p]=1;
    ans=INF;
    double x=(p==0?node[i].x:node[j].x);
    if(i>1)ans=min(ans,dp(i-1,j,0)+cost(x,node[i-1].x,i,j));
    if(j<n)ans=min(ans,dp(i,j+1,1)+cost(x,node[j+1].x,i,j));
    /*
    if(p==0){
       if(i>1)ans=min(ans,dp(i-1,j,0)+cost(node[i].x,node[i-1].x,i,j));
        if(j<n)ans=min(ans,dp(i,j+1,1)+cost(node[i].x,node[j+1].x,i,j));
    }
    else{
        if(i>1)ans=min(ans,dp(i-1,j,0)+cost(node[j].x,node[i-1].x,i,j));
        if(j<n)ans=min(ans,dp(i,j+1,1)+cost(node[j].x,node[j+1].x,i,j));
    }*/
    return ans;
}
int main(){
    while(scanf("%d%lf%lf",&n,&v,&sx)==3&&n){
        memset(vis,0,sizeof(vis));
        double  sumc=0;
        for(int i=1;i<=n;++i){
            scanf("%lf%lf%lf",&node[i].x,&node[i].c,&node[i].dt);
            sumc+=node[i].c;
        }
        sort(node+1,node+1+n);
        psdt[0]=0;
        for(int i=1;i<=n;++i)
            psdt[i]=psdt[i-1]+node[i].dt;
        node[0].x=-INF;
        node[n+1].x=INF;
        double ans=INF;
        for(int i=1;i<=n+1;++i){
            if(sx>node[i-1].x&&sx<node[i].x){
                if(i>1)ans=min(ans,dp(i-1,i-1,0)+cost(sx,node[i-1].x,-1,-1));
                if(i<=n)ans=min(ans,dp(i,i,0)+cost(sx,node[i].x,-1,-1));//这个地方没有抄到。。注意要是i<=n;
                break;
            }
        }
        printf("%.0lf\n",floor(ans+sumc));
    }
}

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值