Jonathan Irvin Gunawan is a very handsome living person. You have to admit it to live in this world.

To become more handsome, Jonathan the Handsome have to collect candies (no relation, indeed). In front of him, there are N candies with different level of sweetness. Jonathan will collect the candies one by one. Jonathan can collect any number of candies, but he must collect the candy in the increasing order of level of sweetness (no two candies will have the same level of sweetness).

Every candy has their own color, which will be represented by a single integer between 0 and 109 inclusive.

If Jonathan collects the first candy, or a candy that has different color with the previous candy he take, he will get 1 point.

If Jonathan collects the candy that has the same color with the previous candy, he will get a combo. Combo-x means that he has collected x candies of the same color consecutively. In other words, if he collect a candy and get combo-(x-1) and he collect a candy with the same color again, he will get combo-(x). And then if he collects a candy with different color, the combo will vanish and back to combo- 1.

(Note : previous candy means the last candy he take)

Every time he get combo-x, he will get x points. Jonathan wants to count how many maximum total points he can get. You are a fan of Jonathan the Handsome have to help him.

Input

The first line consists of a single integer T, indicating the number of
testcases.
For every testcase, the first line consists of a single integer N.
The next line consists of N integers, representing the color of the candy given in the increasing level of sweetness, separated by a single space.

The first line consists of a single integer T, indicating the number of testcases.

For every testcase, the first line consists of a single integer N (1 ≤ N ≤ 1000).

The next line consists of N integers, representing the color of the candy given in the increasing level of sweetness, separated by a single space.

Output

For every case, output a single integer consist of the maximum total points Jonathan can get.

Example

Input:
2
4
1 1 2 1
4
1 2 3 1
Output:
6
4

Explanation

In the first sample, Jonathan chooses not to take the candy with color 2, as he will lose the combo. In the second sample, he will get a maximum total points if he take all of the candies.

题意:N个数,取其子数列,使得总得分最高。得分定义如下:

对于某一个x

若前面有连续的c个x,则得分为c + 1

e.g.我选择下面这些数。

1 2 1 1 3 3 3 3 2 2 1 (取到的数列)

1 1 1 2 1 2 3 4 1 2 1 (得分分值)

思路:DP,先离散化。

状态F[i, j] ,i ——取到的最后一个数为i (i是离散化化后的数字),j ——前面有连续j个i ,F[i, j] ——这种情况下的最大得分

对于当前的数now

F[now, j + 1] = F[now, j] + j (1’)

F[now, 1] = max{F[i, j]} + 1 (i != now) (2’)

(感悟:平时的DP,即便是二维的DP,其状态都是一维的。所以想到还是有点难想到。读者有兴趣可以自己想试着想一下。

#include<bits/stdc++.h>
using namespace std;
const int maxn=;
int a[maxn],b[maxn],f[maxn][maxn],cnt,ans;
int main()
{
int T,N,pos,i,j;
scanf("%d",&T);
while(T--){
ans=; scanf("%d",&N);
for(i=;i<=N;i++) scanf("%d",&a[i]),b[i]=a[i];
sort(b+,b+N+);
cnt=unique(b+,b+N+)-(b+);
memset(f,,sizeof(f));
for(i=;i<=N;i++){
pos=lower_bound(b+,b+cnt+,a[i])-b;
for(j=i;j>=;j--) if(f[pos][j-]) f[pos][j]=max(f[pos][j],f[pos][j-]+j);
f[pos][]=ans+;
for(j=;j<=i;j++) ans=max(ans,f[pos][j]);
}
printf("%d\n",ans);
}
return ;
}

SPOJ:Collecting Candies(不错的DP)的更多相关文章

  1. SPOJ:Harbinger vs Sciencepal(分配问题&不错的DP&bitset优化)

    Rainbow 6 is a very popular game in colleges. There are 2 teams, each having some members and the 2 ...

  2. spoj 1812 LCS2(SAM+DP)

    [题目链接] http://www.spoj.com/problems/LCS2/en/ [题意] 求若干个串的最长公共子串. [思路] SAM+DP 先拿个串建个SAM,然后用后面的串匹配,每次将所 ...

  3. poj2096 Collecting Bugs(概率dp)

    Collecting Bugs Time Limit: 10000MS   Memory Limit: 64000K Total Submissions: 1792   Accepted: 832 C ...

  4. poj 2096 Collecting Bugs(期望 dp 概率 推导 分类讨论)

    Description Ivan is fond of collecting. Unlike other people who collect post stamps, coins or other ...

  5. Collecting Bugs poj2096 概率DP

                                                                Collecting Bugs Time Limit: 10000MS   Me ...

  6. SPOJ BALNUM - Balanced Numbers - [数位DP][状态压缩]

    题目链接:http://www.spoj.com/problems/BALNUM/en/ Time limit: 0.123s Source limit: 50000B Memory limit: 1 ...

  7. poj 2096 Collecting Bugs 【概率DP】【逆向递推求期望】

    Collecting Bugs Time Limit: 10000MS   Memory Limit: 64000K Total Submissions: 3523   Accepted: 1740 ...

  8. 【POJ 2096】Collecting Bugs 概率期望dp

    题意 有s个系统,n种bug,小明每天找出一个bug,可能是任意一个系统的,可能是任意一种bug,即是某一系统的bug概率是1/s,是某一种bug概率是1/n. 求他找到s个系统的bug,n种bug, ...

  9. SPOJ 1435 Vertex Cover 树形DP

    i 表示节点 i ,j=0表示不选择其父节点,j=1表示选择其父节点.f 为其父节点. 取 每个节点选择/不选择 两者中较小的那个. 一组数据: 151 21 31 41 1010 910 1112 ...

随机推荐

  1. 八皇后问题Python实现

    八皇后问题描述 问题: 国际象棋棋盘是8 * 8的方格,每个方格里放一个棋子.皇后这种棋子可以攻击同一行或者同一列或者斜线(左上左下右上右下四个方向)上的棋子.在一个棋盘上如果要放八个皇后,使得她们互 ...

  2. JavaSE的包装类,自动装箱和自动拆箱 ,字符窜转换,toString(),equals(), hashCode()的区别

    一.基本数据类型和包装类 包装类均位于Java.lang包,包装类和基本数据类型的对应关系如下表所示: Primitive-Type   Wrapper-Class        byte       ...

  3. UNIDAC如何驱动MSSQL2000

    UNIDAC如何驱动MSSQL2000 如下图,PROVIDER必须设置为PRSQL.默认的PRAUTO,如果操作系统是XP可以,如果是WIN7以上的,不可以. 原因是MSSQL NATIVE 11已 ...

  4. 基于Lua插件化的Pcap流量监听代理

    1.前言 我们在实际工作中,遇到了一个这样的用例,在每天例行扫描活动中,发现有些应用系统不定期的被扫挂,因为我们不是服务的制造者,没有办法在不同的系统里打印日志,所以我们就想用一个工具来获取特定服务的 ...

  5. 【转载】云计算的三种服务模式:IaaS,PaaS和SaaS

    一张图就看懂了.其他的都不用说了. 原文:http://blog.csdn.net/hjxgood/article/details/18363789

  6. CentOS7 docker.repo 用阿里云Docker Yum源

    yum安装软件的时候经常出现找不到镜像的情况 https://download.docker.com/linux/centos/7/x86_64/stable/repodata/repomd.xml: ...

  7. XSS学习分支图

    转载请注明出处:http://blog.csdn.net/cym492224103 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2 ...

  8. 程序的载入和运行(五)——《x86汇编语言:从实模式到保护模式》读书笔记25

    程序的载入和运行(五)--<x86汇编语言:从实模式到保护模式>读书笔记25 前面几篇博文最终把代码分析完了.这篇就来说说代码的编译.运行和调试. 1.代码的编译及写入镜像文件 之前我们都 ...

  9. const成员函数总结

    const 成员函数: 类的成员函数后面加 const,表明这个函数不会对这个类对象的数据成员(准确地说是非静态数据成员)作不论什么改变. 在设计类的时候.一个原则就是对于不改变数据成员的成员函数都要 ...

  10. ConcurrentHashMap源代码解析

    这些天一直在看集合相关的源代码.确实学到了不少东西.这些集合都是息息相关的,学了就停不下来! 学集合就必须要学习锁的知识.学了锁那么并发编程的知识也不能少,都是非常重要的基础知识. jdk1.8的源代 ...