中文题目,题意好理解。
题解:定义状态DP[i][j]表示第i秒在第j个位置处的最优状态,每一个点只能由相邻点转移,所以转移方程就是dp[i][j]=max({dp[i-1][j],dp[i-1][j-1],dp[i-1][j+1]})+arr[i][j],arr[i][j]表示当前状态下的物品的数目。
code:
#include<bits/stdc++.h> using namespace std; const int N=2000+7; int arr1[N]; int arr2[N]; int dp[N]; void solve(){ int n; cin>>n; for(int i=1;i<=n;i++) cin>>arr1[i]; for(int i=2;i<=n;i++) cin>>arr2[i]; dp[1]=arr1[1]; dp[2]=min(arr2[2],arr1[1]+arr1[2]); for(int i=3;i<=n;i++) dp[i]=min(dp[i-1]+arr1[i],dp[i-2]+arr2[i]); int sec=dp[n]%60; dp[n]-=sec; int cnt=dp[n]/60; int minute=cnt%60; cnt-=minute; int h=cnt/60; h+=8; if(h<10) printf("0%d",h); else printf("%d",h); printf(":"); if(minute<10) printf("0%d",minute); else printf("%d",minute); printf(":"); if(sec<10) printf("0%d",sec); else printf("%d",sec); if(h<12) printf(" am\n"); else printf(" pm\n"); } int main(){ int t; scanf("%d",&t); while(t--) solve(); return 0; }