• Treats for the Cows 区间DP POJ 3186


    题目来源:http://poj.org/problem?id=3186

    (http://www.fjutacm.com/Problem.jsp?pid=1389)

    /**
      题目意思: 约翰经常给产奶量高的奶牛发特殊津贴,于是很快奶牛们拥有了大笔不知该怎么花的钱. 为此,约翰购置了N(1≤N≤2000)份美味的零食来卖给奶牛们.每天约翰售出一份零食. 当然约翰希望这些零食全部售出后能得到最大的收益.这些零食有以下这些有趣的特性: 零食按照1..N编号,它们被排成一列放在一个很长的盒子里.盒子的两端都有开口,约翰每 天可以从盒子的任一端取出最外面的一个. 与美酒与好吃的奶酪相似,这些零食储存得越久就越好吃.当然,这样约翰就可以把它们卖出更高的价钱. 每份零食的初始价值不一定相同.约翰进货时,第i份零食的初始价值为Vi(1≤Vi≤1000). 第i份零食如果在被买进后的第a天出售,则它的售价是vi×a. Vi的是从盒子顶端往下的第i份零食的初始价值.约翰告诉了你所有零食的初始价值, 并希望你能帮他计算一下,在这些零食全被卖出后,他最多能得到多少钱. **/
    思路:这是一题区间动态规划,但是又不是那么复杂的区间动态规划;
       这题要先找对状态,不然很难进行下去,也许别的小伙伴有别的状态,但是我找的状态是dp[i][j]表示i~j范围内取出倒数j-i+1个物品的最大值,比如dp[i][i]就是第取出倒数第一个为a[i]可以获得的值,dp[i-1][i]同理,表示倒数第一、二个为a[i-1],a[i]的最大值。
       然后找对状态了要找转移方程:对于这题先要搞清楚我们是逆推,从区间小推向区间大,也就是用小的求大的,所以dp[i][j]是由比他小的部分加上一些东西组成的,此时我们可以发现,dp[i][j]这个区间我们只有两种取法(题目给的是一个双端队列一样的东西),也就是我们只能取a[j]或者a[i]这两个数,而且这两个数一定是在倒数j-i次取的,因为之前只有j-i- 1(可能是a[i]或a[j]) 个数,而且都是倒数着的,这样我们就可以发现,dp[i][j]=Max(dp[i+1][j]+a[i]*(n-(j-i)), dp[i][j-1]+a[j]*(n-(j-i)));看下面这个图你就能理解他是怎么步步紧逼的合并状态的:

    斜着的颜色分层的部分就表示i、j距离不同时由某些状态过来的最大值,余下的看看代码吧!
     1 #include<stdio.h>
     2 #include<string.h>
     3 const int N=2020;
     4 int dp[N][N], a[N];
     5 int Max(int a, int b){ return a>b?a:b; }
     6 int main( ){
     7     int n;
     8     while(scanf("%d", &n)!=EOF){
     9         memset(dp, 0, sizeof(dp));
    10         for(register int i=1; i<=n; ++i)
    11             scanf("%d", a+i), dp[i][i]=a[i]*n;///设置为当第i个数为最后一个被取的数的情况;
    12         for(register int l=1; l<=n; ++l){///先跑i、j距离为1的区间,然后顺延下去才可以保证不会出错
    13             for(register int i=1; i+l<=n; ++i){
    14                 int j=i+l;
    15                 dp[i][j]=Max(dp[i+1][j]+a[i]*(n-l), dp[i][j-1]+a[j]*(n-l));
    16             }
    17         }
    18         printf("%d
    ", dp[1][n]);
    19     }
    20 }
     
  • 相关阅读:
    一个生日的类,一个人的类(上课)
    c语言菜单框架
    Latex Algorithm 语法错误导致无法编译
    CDQ WQS Rush
    Dinic Rush
    String Rush
    计算几何 学习笔记
    DP Rush
    Graph Rush
    Data Rush EZ ver.
  • 原文地址:https://www.cnblogs.com/DCD112358/p/9016474.html
Copyright © 2020-2023  润新知