主题思想: 动态规划。
这题第一开始想到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,...k
int 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;
}