lightoj1169【DP】

题意(来自大哥):
有两栋楼,左边一栋,右边一栋,层数从1-n,地面的标号为0,每一层有一个水果。有一只猴子在地面上,他现在要上到n层去,在第i层会吃掉水果花费一定时间。
猴子有两种方式从第i层到i+1层,一种是直接往上跳且不花费时间,另一种是花费一定时间到另一栋楼的同一层,然后花费一定时间吃了那层的水果,然后上去且不花费时间;
问猴子到第n层最少时间多少。
在左边每一层吃水果的时间是a[i],右边是b[i];
左边跳到右边是t1[i],右边跳到左边是t2[i];
思路:
dp[i][j]代表到达第i层j栋楼最少时间;
dp[i][0]代表i层的左边,dp[i][1]代表i层的右边
dp[i][0]=min(dp[i-1][0],dp[i-1][1]+t2[i-1])+a[i];
dp[i][1]=min(dp[i-1][1],dp[i-1][0]+t1[i-1])+b[i];

#include <bits/stdc++.h>
using namespace std;

typedef long long LL;

const int N=1e3+10;

int dp[N][2];
int a[N],b[N];
int t1[N],t2[N];
int n;

int main()
{
    int T;
    int cas=1;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
            scanf("%d",&a[i]);
        for(int i=1;i<=n;i++)
            scanf("%d",&b[i]);
        for(int i=1;i<=n-1;i++)
            scanf("%d",&t1[i]);
        for(int i=1;i<=n-1;i++)
            scanf("%d",&t2[i]);

        dp[1][0]=a[1];
        dp[1][1]=b[1];
        for(int i=2;i<=n;i++)
        {
            dp[i][0]=min(dp[i-1][0],dp[i-1][1]+t2[i-1])+a[i];
            dp[i][1]=min(dp[i-1][1],dp[i-1][0]+t1[i-1])+b[i];
        }
        printf("Case %d: %d
",cas++,min(dp[n][0],dp[n][1]));
    }
    return 0;
}
原文地址:https://www.cnblogs.com/keyboarder-zsq/p/5934809.html