hdu 1260 Tickets

来源:互联网 发布:河南金汇鑫软件 编辑:程序博客网 时间:2024/06/18 00:01

主题思想: 动态规划。

这题第一开始想到dp,后来又觉得不是dp,构建了图,按最短路径求,可是TLE, 还是觉得是dp, 这次想通了,dp其实是递归的形式,每次保存结果,避免递归的重复计算,就是dp。 如果要想找到dp,这要从第2个人开始分析,第一个人是一个特例。
核心状态转移方程。
dist[i]=min(dist[i-2]+d[i-2],dist[i-1]+a[i]) ,i=2,3,4,...k

AC代码:

#include <iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int maxn=2005;int a[maxn];int d[maxn];int dist[maxn];int k;//dp   dist[i]=min(dist[i-2]+d[i-2],dist[i-1]+a[i]) ,i=2,3,4,...kint DP(){    dist[0]=0;    dist[1]=a[1];    for(int i=2;i<=k;i++){        dist[i]=min(dist[i-2]+d[i-2],dist[i-1]+a[i]);    }    return dist[k];}int main(){   int T;   scanf("%d",&T);   int total=0;   int hh;   int mm;   int ss;   int tmp;   while(T--){        hh=8;        mm=ss=0;        total=0;        scanf("%d",&k);        // build graph        a[0]=0;        for(int i=1;i<=k;i++){            scanf("%d",&a[i]);        }       for(int i=0;i<k-1;i++){            scanf("%d",&d[i]);       }       total= DP();        hh+=total/3600;        total=total%3600;        mm=total/60;        ss=total%60;        printf("%02d:%02d:%02d ",hh,mm,ss);        if(hh<12) printf("am\n");        else printf("pm\n");   }    return 0;}