zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    高阶函数 练习
    斐波那契数列(Fibonacci sequence)递归函数
    顺序循环队列的基本操作(二)
    顺序循环队列基本操作(一)
    顺序栈的基本操作
    双链表的插入删除
    头插法实现链表逆置
    带头结点单链表的基本操作
    顺序表基本操作
    实现原数组列变成行,再将每一行首尾倒置
  • 原文地址:https://www.cnblogs.com/keyboarder-zsq/p/5934809.html
Copyright © 2011-2022 走看看