• 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;
    }
  • 相关阅读:
    1004 成绩排名
    antd 时间控件
    C语言基础知识2
    OC语言基础知识
    C语言基础知识
    清华大学EMBA总裁班教授翟万宝对阅读的看法
    redis 5.0.2 源码阅读——快速列表quicklist
    封装hiredis——C++与redis对接(一)(string的SET与GET操作)
    redis 5.0.2 源码阅读——压缩列表ziplist
    redis 5.0.2 源码阅读——整数集合intset
  • 原文地址:https://www.cnblogs.com/keyboarder-zsq/p/5934809.html
Copyright © 2020-2023  润新知