HDU 1260 簡單dp
阿新 • • 發佈:2019-01-07
要求:n個人排隊買票,每個人買票有兩種方法:自己買或者和相鄰的一個人一起買,分別消耗a秒和b秒,求n個人買完票所需最少時間。
方法:dp裸題
1.狀態:dp[i]表示第i個人買完票的最短時間。
2.狀態轉移方程:dp[i]=min(dp[i-1]+a[i],dp[i-2]+b[i-1])。
3.注意初始值問題。
4.注意秒如何化為時間。
5.注意中午十二點半是12:30 pm。
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; #define inf 0x3f3f3f3f int main() { int t,n,i,j,k,min1,h,m,s; int a[10000],b[10000],dp[10000]; scanf("%d",&t); while(t--) { scanf("%d",&n); for(i=0;i<n;i++) scanf("%d",&a[i]); for(i=0;i<n-1;i++) scanf("%d",&b[i]); memset(dp,inf,sizeof(dp)); dp[0]=a[0]; dp[1]=min(a[0]+a[1],b[0]); for(i=2;i<n;i++) { dp[i]=min(dp[i-1]+a[i],dp[i-2]+b[i-1]); } h=dp[n-1]/3600+8; m=dp[n-1]%3600/60; s=dp[n-1]%60; if(h>=12) printf("%02d:%02d:%02d pm\n",h-12,m,s); else printf("%02d:%02d:%02d am\n",h,m,s); } }