http://acm.hdu.edu.cn/showproblem.php?pid=1260
题目大意:n个人买票,每个人买票都花费时间,相邻的两个人可以一起买票以节约时间;
所以一个人可以自己买票也可以和前面的人一起买也可以和后面的人一起买,和后面的人一起买也就相当于后面的人后前面的人一起买;
因此一个人有两种买票方式自己买或者和前面的人一起买,选取耗时最短的;
得到DP的状态方程:
—dp[i] = min(dp[i - 1] + a[i], dp[i - 2] + b[i]);
样例:
1
5
15 5 10 5 20
20 10 7 10
1 2 3 4 5 分别表示每个人的编号
(1)表示第i个人自己买票大家公用的时间
(2)表示第i个人和前面一个人一起买票大家公用的时间
(3)表示每个人自己买票花费的时间
(4)表示每两个人一起买票花费的时间
每一次dp去(1),(2)的最小值
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
#include<stdlib.h>
#define N 2010 using namespace std; int main()
{
int i, t, n, a[N], b[N], dp[N], m;
scanf("%d", &t);
while(t--)
{
int H, M, S;
scanf("%d", &n);
for(i = ; i <= n ; i++)
scanf("%d", &a[i]);
for(i = ; i <= n ; i++)
scanf("%d", &b[i]);
dp[] = a[];
for(i = ; i <= n ; i++)
dp[i] = min(dp[i - ] + a[i], dp[i - ] + b[i]);
m = dp[n];
H = m / ;
M = (m - H * ) / ;
S = m - H * - M * ;
H += ;
if(H <= )
printf("%02d:%02d:%02d am\n", H, M, S);
else
printf("%02d:%02d:%02d pm\n", H, M, S);
}
return ;
}