POJ 2355 Railway tickets

    xiaoxiao2021-03-25  155

    POJ 2355 Railway tickets

    tyvj3317 / vijos 火车票

    这个题非常简单的DP,但是要注意不要读错题,是两个站台之间只允许买一张票的……

    开始读错题了WA了两次……

    dp方程是显然的,dp[i]表示从s开始到第i个站台最小花费

    则:

    dp[i]=min{dp[k]+cost(k,i)},s<=k<i,dist(i)-dist(k)<=L3

    边界条件:dp [ s ] = 0 .

    其中cost函数是用来计算两个站台直接到达的花费的。

     

    //POJ 2355 #include<iostream> #include<cstdio> #include<cstring> #include<climits> #include<algorithm> #define MAXN 10010 #define INF LLONG_MAX #define ull long long #define debug(x) cerr<<#x<<"="<<x #define ln <<endl #define sp <<" " using namespace std; int dis[MAXN],L[10],c[10],n,s,t; ull dp[MAXN]; inline int get_cnt(int d,int L) { int cnt=d/L; if(d%L) cnt++; return cnt; } ull cost(int d) { if(d==0) return 0; else if(d<=L[1]) return c[1]; else if(d<=L[2]) return c[2]; else if(d<=L[3]) return c[3]; else return INF; } int main() { while(scanf("%d%d%d%d%d%d",&L[1],&L[2],&L[3],&c[1],&c[2],&c[3])!=EOF) { scanf("%d%d%d",&n,&s,&t); if(s>t) swap(s,t); dis[1]=0;dp[s]=0; for(int i=2;i<=n;i++) scanf("%d",&dis[i]); for(int i=s+1;i<=n;i++) { dp[i]=INF; for(int k=i-1;k>=s&&dis[i]-dis[k]<=L[3];k--) dp[i]=min(dp[i],dp[k]+cost(dis[i]-dis[k])); // printf("dp[%d]=%d\n",i,dp[i]); } printf("%d\n",dp[t]); } return 0; }

     

    转载请注明原文地址: https://ju.6miu.com/read-1713.html

    最新回复(0)