HDU 1260 Tickets(基础dp)

  一开始我对这个题的题意理解有问题,居然超时了,我以为是区间dp,没想到是个水dp,我泪奔了....

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<cmath>
#include<iostream>
using namespace std;

///本来以为是一个区间dp,结果是个水dp,从前往后选就可以了,选的方式有两种,每次都是最优,结果也最优;
///我还TLE了,0(n*n*n)的复杂度啊
///区间dp其实不对,因为这里的队列有顺序,只能从前向后给票,而区间dp是任意位置合并
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        int n,s[2200],d[2200];
        int dp[2200];
        scanf("%d",&n);
        for(int i = 1; i <= n; i++)
            scanf("%d",&s[i]);
        for(int i = 2; i <= n; i++)
            scanf("%d",&d[i]);
        dp[0] = 0,dp[1] = s[1];
        for(int i = 2; i <= n; i++)
        {
            dp[i] = min(dp[i-1] + s[i],dp[i-2]+d[i]);
        }
        int add = dp[n];
        int h = add / 3600 + 8,hyu = add % 3600;
        int m = hyu / 60,ss = hyu % 60;
        h %= 24;
        if(h >= 12)
        {
            printf("%02d:%02d:%02d pm
",h%12,m,ss);
        }
        else printf("%02d:%02d:%02d am
",h,m,ss);
    }
    return 0;
}
原文地址:https://www.cnblogs.com/jifahu/p/5449282.html