zoukankan      html  css  js  c++  java
  • Codeforces13C–Sequence (区间DP)

    题目大意

    给定一个含有N个数的序列,要求你对一些数减掉或者加上某个值,使得序列变为非递减的,问你加减的值的总和最少是多少?

    题解

    一个很显然的结果就是,变化后的每一个值肯定是等于原来序列的某个值,因为只需要变为非递减的,所以对于某个数要么不变,要么变成左右附件的某个值。这样我们就可以根据前述条件得出DP方程了:dp[i][j]=min(dp[i][j-1],dp[i-1][j]+|a[i]-b[j]|)(a为原序列,b为排序后的序列),方程的意思是,把序列前i个数变为非递减序列并且以不超过b[j]的值结尾的最小花费,那么它要么是以不超过b[j-1]结尾的最小花费,或者是刚好以b[j]结尾的最小花费

    代码:

     1 #include <algorithm>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <cmath>
     5 #include <cstdlib>
     6 using namespace std;
     7 #define MAXN 5005
     8 #define  INF 0x3f3f3f3f
     9 typedef long long LL;
    10 LL dp[MAXN],a[MAXN],b[MAXN];
    11 int main()
    12 {
    13     int n;
    14     scanf("%d",&n);
    15     for(int i=1;i<=n;i++) scanf("%I64d",&a[i]),b[i]=a[i];
    16     sort(b+1,b+n+1);
    17     for(int i=1;i<=n;i++)
    18         for(int j=1;j<=n;j++)
    19         {
    20             if(j==1)dp[j]+=abs(a[i]-b[j]);
    21             else
    22                 dp[j]=min(dp[j-1],dp[j]+abs(a[i]-b[j]));
    23         }
    24         printf("%I64d
    ",dp[n]);
    25         return 0;
    26 }
    View Code

    原创博客:https://www.cnblogs.com/zjbztianya/archive/2013/09/06/3305003.html

  • 相关阅读:
    Binary Search Tree Iterator 解答
    Invert Binary Tree 解答
    Min Stack 解答
    Trapping Raining Water 解答
    Candy 解答
    Jump Game II 解答
    Implement Hash Map Using Primitive Types
    Gas Station 解答
    Bucket Sort
    HashMap 专题
  • 原文地址:https://www.cnblogs.com/zmin/p/8470812.html
Copyright © 2011-2022 走看看