zoukankan      html  css  js  c++  java
  • 2017级算法第三次上机-B.SkyLee逛漫展

    ALS 一道动态规划最经典的题目

    动态规划实质上其实就是表格法,利用表格来记录每个子问题的解。

    DP所关注的其实是递归 即一个较小问题的解和一个较大问题的状态转移问题。

    其次还要关注的其实还是是初始值的设立,这个决定了后续的递推能否顺利的进行。

    还有要思考好dp数组所代表的具体的含义 这样在状态转移的过程中 也可以好一点理解。

    #include <iostream>
    #include <algorithm>
    #include <cstring>
    
    using namespace std;
    const int maxlen=1e3 + 10;
    long long p1[maxlen],p2[maxlen],t[3][maxlen];
    long long dp[3][maxlen];
    //dp[1][j] 代表的是在左边第j家店铺买东西所话费的最小时间
    int main(){
        //流水线问题 动态规划经典问题 上机的时候是直接打板子过的
        long long n,x,y,i,j,k;
        memset(dp,0,sizeof(dp));
        memset(p1,0,sizeof(p1));
        memset(p2,0,sizeof(p2));
        memset(t,0,sizeof(t));
        while(~scanf("%lld",&n)){
            memset(dp,0,sizeof(dp));
            for(i=1;i<=n;i++)
                scanf("%lld",&p1[i]);
            for(i=1;i<=n;i++)
                scanf("%lld",&p2[i]);
            for(i=1;i<=2;i++)
                for(j=1;j<=n-1;j++)
                    scanf("%lld",&t[i][j]);
            //开始DP
                dp[1][1]=p1[1];
                dp[2][1]=p2[1];
                for(j=2;j<=n;j++){
                        dp[1][j]=p1[j] + min(dp[1][j-1] , dp[2][j-1] + t[2][j-1]);
                        dp[2][j]=p2[j] + min(dp[2][j-1] , dp[1][j-1] + t[1][j-1]);
                }
            printf("%lld
    ",min(dp[1][n],dp[2][n]));
        }
        return 0;
    }
  • 相关阅读:
    leetcode 673. 最长递增子序列的个数 java
    leetcode 148. 排序链表 java
    leetcode 98. 验证二叉搜索树 java
    leetcode 29. 两数相除 java
    leetcode 234. 回文链表 java
    Valid Palindrome LeetCode Java
    Single Number II LeetCode Java
    Single Number LeetCode java
    Search in Rotated Sorted Array II LeetCode Java
    Search in Rotated Sorted Array leetcode java
  • 原文地址:https://www.cnblogs.com/visper/p/10094286.html
Copyright © 2011-2022 走看看