题目:https://www.luogu.org/problemnew/show/P2943

一下想到n^2。然后不会了。

看过TJ之后似乎有了新的认识。

  n^2的冗余部分在于当后面那部分的种类数一样时,只需用最前面的dp转移过来即可。

  所以如果枚举的是后面那部分的种类数,对于每个种类数记录一下最前面的dp,也许会好一些。

但是种类也有n种,怎么办?

  考虑是否需要枚举全部从1~n。

  k*k是一个比较大的数。发现一定有一种情况使得时间花费为n(即全部单个选),所以只需要枚举k*k<=n的种类数即可。

结果知道了思路却还是写不出来。

  关键在于怎么在新入一个值之后维护“后面那部分有 j 个种类”。

  1)树状数组。就用HH的项链那样的思想。

      结果发现不能很快找到新的对应地方。

  2)(参考TJ)记录pre,当pre[ i ]<=zy[ j ]的时候zy[ j+1 ]=zy[ j ]。并且倒序什么的。

      发现不对。因为转移给 j+1 后不一定是最靠前的位置。

  3)(再次参考TJ)记录pre和nxt,当pre[ i ]<=zy[ j ]的时候将zy[ j ]++到合适的第一个位置。

      结果还是不行。因为 j 在前面的一些时候其实是不满 j 个种类的。贸然++会使位置偏大。

        那记录一个cnt表示现在已经出现了几个种类,按这个枚举 j 呢?结果还是不行。

          因为就算上界改为现在出现了几个种类,在最开始的时候一些 j 其实还是不满 j 个种类。

  4)(再再次参考TJ)记录cnt[ j ],当 cnt[ j ] > j 的时候进入while。

      当不行的时候就是要多记录一些东西才行呢……

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
const int N=4e5+,M=;
int n,m,a[N],dp[N],pre[N],nxt[N],pos[N],zy[N],cnt[N];
int rdn()
{
int ret=;char ch=getchar();
while(ch>''||ch<'')ch=getchar();
while(ch>=''&&ch<='')(ret*=)+=ch-'',ch=getchar();
return ret;
}
int main()
{
n=rdn();m=rdn();
memset(dp,,sizeof dp);dp[]=;
for(int i=;i<=n;i++)
{
a[i]=rdn();pre[i]=pos[a[i]];nxt[pre[i]]=i;pos[a[i]]=i;nxt[i]=n+;
}
for(int i=;i<=n;i++)
for(int j=;j*j<=n;j++)
{
if(pre[i]<=zy[j])cnt[j]++;//不要cnt[zy[j]]
if(cnt[j]>j)
{
cnt[j]--;while(nxt[zy[j]+]<=i)zy[j]++;zy[j]++;
}
dp[i]=min(dp[i],dp[zy[j]]+j*j);
}
printf("%d",dp[n]);
return ;
}

洛谷2943 [USACO09MAR]清理Cleaning Up——转变枚举内容的dp的更多相关文章

  1. luogu 2943 [USACO09MAR]清理Cleaning Up 动态规划

    非常巧妙的动态规划. 你会发现每一个区间地颜色种类不能超过 $\sqrt n$, 所以可以直接枚举区间颜色种类. 令这个为 $pos[j],$ 然后考虑如何去更新这个东西就行了. Code: #inc ...

  2. 洛谷 P4284 [SHOI2014]概率充电器 概率与期望+换根DP

    洛谷 P4284 [SHOI2014]概率充电器 概率与期望+换根DP 题目描述 著名的电子产品品牌\(SHOI\) 刚刚发布了引领世界潮流的下一代电子产品-- 概率充电器: "采用全新纳米 ...

  3. 洛谷P2947 [USACO09MAR]仰望Look Up

    P2947 [USACO09MAR]仰望Look Up 74通过 122提交 题目提供者洛谷OnlineJudge 标签USACO2009云端 难度普及/提高- 时空限制1s / 128MB 提交   ...

  4. 洛谷AT2046 Namori(思维,基环树,树形DP)

    洛谷题目传送门 神仙思维题还是要写点东西才好. 树 每次操作把相邻且同色的点反色,直接这样思考会发现状态有很强的后效性,没办法考虑转移. 因为树是二分图,所以我们转化模型:在树的奇数层的所有点上都有一 ...

  5. 洛谷4859 BZOJ3622 已经没什么好害怕的了(DP,二项式反演)

    题目链接: 洛谷 BZOJ 题目大意:有两个长为 $n$ 的序列 $a,b$,问有多少种重排 $b$ 的方式,使得满足 $a_i>b_i$ 的 $i$ 的个数比满足 $a_i<b_i$ 的 ...

  6. 洛谷P4608 [FJOI2016]所有公共子序列问题 【序列自动机 + dp + 高精】

    题目链接 洛谷P4608 题解 建个序列自动机后 第一问暴搜 第二问dp + 高精 设\(f[i][j]\)为两个序列自动机分别走到\(i\)和\(j\)节点的方案数,答案就是\(f[0][0]\) ...

  7. 【题解】洛谷P3166 [CQOI2014] 数三角形(组合+枚举)

    洛谷P3166:https://www.luogu.org/problemnew/show/P3166 思路 用组合数求出所有的3个点组合(包含不合法的) 把横竖的3个点共线的去掉 把斜的3个点共线的 ...

  8. 【洛谷3648/BZOJ3675】[APIO2014]序列分割(斜率优化DP)

    题目: 洛谷3648 注:这道题洛谷3648有SPJ,要求输出方案.BZOJ3675数据组数较多但不要求输出方案. 分析: 这可能是我第三次重学斜率优化了--好菜啊 这道题首先一看就是个DP.稍微推一 ...

  9. 洛谷P1879 [USACO06NOV]玉米田Corn Fields(状压dp)

    洛谷P1879 [USACO06NOV]玉米田Corn Fields \(f[i][j]\) 表示前 \(i\) 行且第 \(i\) 行状态为 \(j\) 的方案总数.\(j\) 的大小为 \(0 \ ...

随机推荐

  1. APIGateway网关安全设计

    Spring Cloud里面有个组件 Zuul网关 网关和 过滤器 拦截器很相似 网关可以实现过滤器 拦截器的功能 而且可以实现Nginx的基本功能 反向代理 负载均衡ribbon Nginx是软负载 ...

  2. Hibernate常见优化策略

    ① 制定合理的缓存策略(二级缓存.查询缓存). ② 采用合理的Session管理机制. ③ 尽量使用延迟加载特性. ④ 设定合理的批处理参数. ⑤ 如果可以,选用UUID作为主键生成器. ⑥ 如果可以 ...

  3. java官网下载

    安装版 http://javadl.oracle.com/webapps/download/AutoDL?BundleId=234471_96a7b8442fe848ef90c96a2fad6ed6d ...

  4. PAT1042. Shuffling Machine (20)

    #include <iostream> #include <vector> using namespace std; int n; string card[54]={" ...

  5. MySql 存储过程实例 - 转载

    MySql 存储过程实例 将下面的语句复制粘贴可以一次性执行完,我已经测试过,没有问题! MySql存储过程简单实例:                                          ...

  6. QTabWidget和QtabBar的区别

    切换标签tab 是QTabBar int QTabWidget::insertTab ( int index, QWidget * page, const QString & label ) ...

  7. 使用mybatis报错constructor found in com.atguigu.mybatis.bean.Department matching [java.lang.Integer, java.lang.String]

    报错constructor found in com.atguigu.mybatis.bean.Department matching [java.lang.Integer, java.lang.St ...

  8. 深入理解Lambda

    概述 Lambda是一个表达式,也可以说它是一个匿名函数.然而在使用它或是阅读Lambda代码的时候,却显得并不那么容易.因为它匿名,因为它删减了一些必要的说明信息(比如方法名).下面就来说说Lamb ...

  9. [转]linux将一个服务器上的文件或者文件夹复制到另一台服务器上

    本文转载自<linux 将一个服务器上的文件或者文件夹复制到另一台服务器上>,有时间实践一把 使用scp将一个Linux系统中的文件或文件夹复制到另一台Linux服务器上 复制文件或文件夹 ...

  10. python递归 及 面向对象初识及编程思想

    递归 及 面向对象初识及编程思想   一.递归 1.定义: 在函数内部,可以调用其他函数.如果一个函数在内部调用自身本身,这个函数就是递归函数. (1)递归就是在过程或函数里调用自身: (2)在使用递 ...