洛谷2943 [USACO09MAR]清理Cleaning Up——转变枚举内容的dp
题目: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的更多相关文章
- luogu 2943 [USACO09MAR]清理Cleaning Up 动态规划
		非常巧妙的动态规划. 你会发现每一个区间地颜色种类不能超过 $\sqrt n$, 所以可以直接枚举区间颜色种类. 令这个为 $pos[j],$ 然后考虑如何去更新这个东西就行了. Code: #inc ... 
- 洛谷 P4284 [SHOI2014]概率充电器 概率与期望+换根DP
		洛谷 P4284 [SHOI2014]概率充电器 概率与期望+换根DP 题目描述 著名的电子产品品牌\(SHOI\) 刚刚发布了引领世界潮流的下一代电子产品-- 概率充电器: "采用全新纳米 ... 
- 洛谷P2947 [USACO09MAR]仰望Look Up
		P2947 [USACO09MAR]仰望Look Up 74通过 122提交 题目提供者洛谷OnlineJudge 标签USACO2009云端 难度普及/提高- 时空限制1s / 128MB 提交 ... 
- 洛谷AT2046 Namori(思维,基环树,树形DP)
		洛谷题目传送门 神仙思维题还是要写点东西才好. 树 每次操作把相邻且同色的点反色,直接这样思考会发现状态有很强的后效性,没办法考虑转移. 因为树是二分图,所以我们转化模型:在树的奇数层的所有点上都有一 ... 
- 洛谷4859 BZOJ3622 已经没什么好害怕的了(DP,二项式反演)
		题目链接: 洛谷 BZOJ 题目大意:有两个长为 $n$ 的序列 $a,b$,问有多少种重排 $b$ 的方式,使得满足 $a_i>b_i$ 的 $i$ 的个数比满足 $a_i<b_i$ 的 ... 
- 洛谷P4608 [FJOI2016]所有公共子序列问题  【序列自动机 + dp + 高精】
		题目链接 洛谷P4608 题解 建个序列自动机后 第一问暴搜 第二问dp + 高精 设\(f[i][j]\)为两个序列自动机分别走到\(i\)和\(j\)节点的方案数,答案就是\(f[0][0]\) ... 
- 【题解】洛谷P3166 [CQOI2014] 数三角形(组合+枚举)
		洛谷P3166:https://www.luogu.org/problemnew/show/P3166 思路 用组合数求出所有的3个点组合(包含不合法的) 把横竖的3个点共线的去掉 把斜的3个点共线的 ... 
- 【洛谷3648/BZOJ3675】[APIO2014]序列分割(斜率优化DP)
		题目: 洛谷3648 注:这道题洛谷3648有SPJ,要求输出方案.BZOJ3675数据组数较多但不要求输出方案. 分析: 这可能是我第三次重学斜率优化了--好菜啊 这道题首先一看就是个DP.稍微推一 ... 
- 洛谷P1879 [USACO06NOV]玉米田Corn Fields(状压dp)
		洛谷P1879 [USACO06NOV]玉米田Corn Fields \(f[i][j]\) 表示前 \(i\) 行且第 \(i\) 行状态为 \(j\) 的方案总数.\(j\) 的大小为 \(0 \ ... 
随机推荐
- AppLocker Pro FAQ
			How to use AppLocker Pro: 1. Start AppLocker Pro, create a password.2. In the main console, click &q ... 
- LeetCode——Longest Consecutive Sequence
			LeetCode--Longest Consecutive Sequence Question Given an unsorted array of integers, find the length ... 
- python+senium+chrome的简单爬虫脚本
			简述: 开始接触python写web自动化的脚本主要源于在公司订阅会议室,主要是使用python+selenium+chromedriver驱动chrome浏览器来完成的,其中部分python代码可以 ... 
- nginx 403错误
			1.出现此种错误的原因有可能是所有者对目录没有写的权限,此时可用chmod 777 目录名 先完全放开权限,如果问题解决,则在慢慢缩小访问权限. 解决办法:chown -R nginx_user:ng ... 
- C# 实现汉字转拼音
			/// <summary> /// 生成拼音简码 /// </summary> /// <param name="unicodeString"> ... 
- XMLHTTP.readyState
			XMLHTTP.readyState的五种就绪状态: 0:请求未初始化(还没有调用 open()). 1:请求已经建立,但是还没有发送(还没有调用 send()). 2:请求已发送,正在处理中(通常现 ... 
- java socket - 半关闭
			通常,使用关闭输出流来表示输出已经结束.但在进行网络通信时则不能这样做.因为我们关闭输出流时,该输出流对应的Socket也将随之关闭,这样程序将无法再从该socket中读取数据. 为了应付这种情况,s ... 
- TCP中间件_个人方案
			按照功能分类,不管是直接的 insert/delete/update/select语句 还是 调用存储过程,基本的功能 就是 增删改查.又分为两大类: (1).查询(会返回结果集的),(2).非查询( ... 
- node基础(一)——http模块
			一.http模块 http.createSverver() http是node自带的模块,通过require("http")的方法载入: 使用http创建服务器: http.cre ... 
- yii2输出sql
			yii2如何输出sql语句? 单表查询sql: 我的model是:coupon,那么sql输出为: $a = coupon::find()->createCommand()->getRaw ... 
