CF260--C--dp<最大不连续子序列和>

啊 .... 这次的CF我正好没去做啊=-=   那晚 电脑突然神经质了 各种网页超慢打开。。。

更坑的是 持续了1个多小时 都搞的我想 重装了 ....  MD  又可以正常访问了 卧槽*******

但  巧的是 那时候 正好快开始CF了 一下子 没心情去做了

        touch  me

今天 去看了下 就是前几天 做的那个 最大不连续子序列和  我也特别提过 =-=

好忧伤....

  

 1 #include <iostream>
 2 #include <algorithm>
 3 #include <cstring>
 4 using namespace std;
 5
 6 typedef long long LL;
 7 const int size = 100000;
 8 LL cnt[size];
 9 LL dp[size];
10
11 int main()
12 {
13     int n , num , mmax;
14     LL ans;
15     while( cin >> n )
16     {
17         memset( cnt , 0 , sizeof(cnt) );
18         mmax = 0;
19         for( int i = 1 ; i<=n ; i++ )
20         {
21             cin >> num;
22             cnt[ num ] ++;
23             if( mmax < num )
24                 mmax = num;
25         }
26         dp[1] = cnt[1]*1;
27         dp[2] = cnt[2]*2;
28         ans = max( dp[1] , dp[2] );
29         for( int i = 3 ; i<=mmax ; i++ )
30         {
31             dp[i] = max( dp[i-2] , dp[i-3] ) + cnt[i]*i;
32             if( ans < dp[i] )
33                 ans = dp[i];
34         }
35         cout << ans << endl;
36     }
37     return 0;
38 }

CF260--C--dp<最大不连续子序列和>

时间: 2025-01-15 13:20:10

CF260--C--dp<最大不连续子序列和>的相关文章

HDU 2845 Beans (最大不连续子序列和)

Beans Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2637    Accepted Submission(s): 1302 Problem Description Bean-eating is an interesting game, everyone owns an M*N matrix, which is filled wi

HDU 2845 Beans(DP,最大不连续和)

题意    吃豆子游戏    当你吃了一个格子的豆子   该格子左右两个和上下两行就不能吃了    输入每个格子的豆子数    求你最多能吃多少颗豆子 可以先求出每行你最多可以吃多少颗豆子   然后每行就压缩成只有一个格子了   里面的豆子数就是那一行最多可以吃的豆子数   然后问题就变成求一列最多可以吃多少颗豆子了   和处理每一行一样处理   那么问题就简化成求一行数字的最大不连续和问题了 令d[i]表示某一行前i个豆子的最大和  有两种情况  吃第i个格子中的豆子和不吃第i个格子中的豆子

dp --- 最大上升子序列

<传送门> [题目大意] 首先给你一个数n,然后给你n个数,现在要你从这n个数字中找一个上升子序列使得这些子序列的和最大. [题目分析] 简单dp,求最大上升子序列. 首先我们得设两个数组a[1010]和dp[1010].a[1010]存放输入的数列,dp[1010]用来存放从开始到当前的最大上升子序列: 状态转移方程为:  dp[i]=a[i]+max(dp[j]&&a[j]<a[i]&&0<=j<i); 代码很简单: #include<

(hdu step 3.2.1)Max Sum(简单dp:求最大子序列和、起点、终点)

在写题解之前给自己打一下广告哈~..抱歉了,希望大家多多支持我在CSDN的视频课程,地址如下: http://edu.csdn.net/course/detail/209 题目: Max Sum Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 1390 Accepted Submission(s): 542   Problem Descrip

动态规划(dp)----公共子序列(LCS) 问题进一步理解

相对于上一篇 初级 ,这道题稍加深难度,下面这题,比上面多了一个最长子序列的输出,测试一下理解程度,逆序过程 51nod1006 给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的) 比如两个串为: abcicba abdkscab ab是两个串的子序列,abc也是,abca也是,其中abca是这两个字符串最长的子序列. Input 第1行:字符串A 第2行:字符串B (A,B的长度 <= 1000) Output 输出最长的子序列,如果有多个,随意输出1个. Input示例

1925: [Sdoi2010]地精部落 dp, 抖动子序列

看到这道题第一反应就把该题与白书的一道例题联系起来了.(虽然后来证明两者并没有联系.)因此我一开始的思路就是从n到1一个个加进去.虽然的确搞不太出来. 然后开始膜题解了.………………………………好可耻啊! 首先可以证明.一个开头下降的抖动子序列 1~n 可以通过 n - xi + 1 (xi 为 第i位的值 )的形式变为一个上升的. 然后就利用这个性质搞了 设 f[i][j] 为长度为 i , 分别以 1~j 开头且开头上升(如果你要问我为什么是上升的你可以自己推一下,反正我推不出来.)的方案数

hdu 1087 Super Jumping! Jumping! Jumping!(dp:上升子序列最大和)

Super Jumping! Jumping! Jumping! Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 24824    Accepted Submission(s): 10961 Problem Description Nowadays, a kind of chess game called "Super Jumping!

hdu 1087 Super Jumping! Jumping! Jumping! 简单的dp

Super Jumping! Jumping! Jumping! Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 34052    Accepted Submission(s): 15437 Problem Description Nowadays, a kind of chess game called “Super Jumping!

POJ 1952 BUY LOW, BUY LOWER DP记录数据

最长递减子序列,加记录有多少个最长递减子序列,然后需要去重. 最麻烦的就是去重了. 基本的思路就是:全面出现重复的值,然后还是相同长度的子序列,这里的DP记录的子序列是以当前值为结尾的时候,并且一定选择这个值的最长递减子序列, 那么就需要减去前面已经出现过了的子序列. 有点绕口. 举例就是9 8 9 8 2 和 10 5 12 5 3:这些例子去重. 本类型的题目如果不用记录数据是可以使用O(nlgn)的算法的,不过暂时不知道如何记录数据.故此这里只使用DP了. #include <stdio.