zoukankan      html  css  js  c++  java
  • 【USACO习题】奶牛零食

    本题在洛谷上的链接:https://www.luogu.org/problemnew/show/P2858


    算是一道区间DP的水题,很容易设计出状态dp[i][j]表示[i,j]所能产生的最大价值,那么有dp[i][j]=max(dp[i+1][j]+v[i]*(n-l+1),dp[i][j-1]+v[j]*(n-l+1));

    注意,这里相当于将元素添加到序列中,因此最先加入的反而是出售较晚的,同时,不难得出初始边界,dp[i][i]=n*v[i]。

     1 #include <cstdio>
     2 #include <algorithm>
     3 
     4 using namespace std;
     5 
     6 const int maxn = 2005;
     7 
     8 int v[maxn], dp[maxn][maxn];
     9 
    10 int main() {
    11     int n;
    12     scanf("%d", &n);
    13     for (int i = 1; i <= n; ++i)
    14         scanf("%d", &v[i]);
    15     for (int i = 1; i <= n; ++i)
    16         dp[i][i] = v[i] * n;
    17     for (int l = 2; l <= n; ++l)
    18         for (int i = 1; i <= n - l + 1; ++i) {
    19             int j = i + l - 1;
    20             dp[i][j] = max(dp[i + 1][j] + v[i] * (n - l + 1), dp[i][j - 1] + v[j] * (n - l + 1));
    21         }
    22     printf("%d", dp[1][n]);
    23     return 0;
    24 }
    AC代码
  • 相关阅读:
    paste DEMO合并文件
    diff 文件比较
    grep DEMO
    tr DEMO
    uniq DEMO
    sort DEMO
    定义提示符 PS1 PS4
    MAVEN修改localRepository不起作用
    java数组初始化
    oracle监听服务无法打开
  • 原文地址:https://www.cnblogs.com/Mr94Kevin/p/9898301.html
Copyright © 2011-2022 走看看