zoukankan      html  css  js  c++  java
  • cf455a(简单dp)

    题意:给出一个长度为n的数列,元素为a1, a2, ...an;删除ai,ai+1,ai-1 可以得到ai积分,输出最多可以得到多少积分;

    题解:开一个数组a存取数列,a[i]表示元素i的个数,所以删除i可以得到a[i]*i积分;

    i可以选择删除或者不删除,dp[i]表示i删除或不删除时的总积分, 如果i-1删除,则i必定删除;

    若i不删除,则dp[i]=dp[i-1];

    若i删除,则dp[i]=dp[i-2]+a[i]*i;

    由此可得动态转移方程式:dp[i]=max(dp[i]=dp[i-1],dp[i]=dp[i-2]+a[i]*i);

    代码如下:

     1 #include <bits/stdc++.h>
     2 #define MAXN 100000+10
     3 using namespace std;
     4 
     5 int main(void)
     6 {
     7     int n, Max=0;
     8     long long a[MAXN], dp[MAXN];
     9     memset(a, 0, sizeof(a));
    10     memset(dp, 0, sizeof(dp));
    11     cin >> n;
    12     for(int i=0; i<n; i++)
    13     {
    14         int x;
    15         cin >> x;
    16         if(x>Max)  Max=x;
    17         a[x]++;
    18     }
    19     for(int i=1; i<=Max; i++)
    20     dp[i]=max(dp[i-1], dp[i-2]+a[i]*i);
    21     cout << dp[Max] <<  endl;
    22     return 0;
    23 }
  • 相关阅读:
    sb#run():
    aop编程,自定义注解参数和方法范围
    vue 工程化
    mybatis SqlSession
    java传时间
    树的同构
    串的模式匹配
    堆栈模拟队列
    银行业务队列简单模拟
    一元多项式的乘法与加法运算
  • 原文地址:https://www.cnblogs.com/geloutingyu/p/5746642.html
Copyright © 2011-2022 走看看