一开始我对这个题的题意理解有问题,居然超时了,我以为是区间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; }