DP经典 BZOJ 1584: [Usaco2009 Mar]Cleaning Up 打扫卫生
2016-05-18 12:01
591 查看
BZOJ 1584: [Usaco2009 Mar]Cleaning Up 打扫卫生
Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 419 Solved: 278
Description
有N头奶牛,每头那牛都有一个标号Pi,1 <= Pi <= M <= N <= 40000。现在Farmer John要把这些奶牛分成若干段,定义每段的不河蟹度为:若这段里有k个不同的数,那不河蟹度为k*k。那总的不河蟹度就是所有段的不河蟹度的总和。Input
第一行:两个整数N,M第2..N+1行:N个整数代表每个奶牛的编号
Output
一个整数,代表最小不河蟹度Sample Input
13 41
2
1
3
2
2
3
4
3
4
3
1
4
Sample Output
11/*因为这个题目分组是没有限制的,所以我们DP方程不能把分组作为一个状态 正解:最差情况每个数位于一段,ans=n,所以若有一段区间内不同的数的数量<=sqrt(n),否则结果一定不是最优。 nsqrt(n)求法:维护b[j],c[j],f[j],pre[j]数组。 b[j]表示b[j]+1...i有j个不同的数的区间的最左端。 那么可以知道f[i]=min{f[i],f[b[j]]+j*j};这样时间复杂度就降了下来 如何维护b[j]数组,当i向后移动一位的时候,pre[a[i]]记录a[i]出现的最后一个位置是哪里? 那么:i++后,pre[a[i]]<=b[j],说明b[j]+1...到i这段序列的不同数的数目就是j+1了,我们用c[j]来记录这个情况,顺便更新pre[a[i]],而且始终维护c[j]==j; 那么b[j]仍然是符合题意的。 维护c[j]就要从b[j]+1开始向后面删除数据,删除时判断若pre[a[t]]>t,则说明是删除了相同的数,对于最后的和谐值没有影响,所以还要删数 知道pre[a[t]]<=t,删除a[t],顺便更新b[j]的位置 */ #define N 40100 #include<iostream> using namespace std; #include<cstdio> #include<cmath> #include<cstring> int f ,b ,c ,pre ,a ; int n,m; void input() { scanf("%d%d",&n,&m); for(int i=1;i<=n;++i) scanf("%d",&a[i]); memset(pre,-1,sizeof(pre));/*别忘了设置为-1,因为下面会与b[j]==0的初值进行比较*/ memset(f,127,sizeof(f)); } void chuli() { int sqrtn=sqrt(n+0.5); f[0]=0;/*初始化,前0个数的不和谐值为0,*/ for(int i=1;i<=n;++i) { for(int j=1;j<=sqrtn;++j) { if(pre[a[i]]<=b[j]) c[j]++;/*统计新加入的数是不是符合要求*/ } pre[a[i]]=i;/*更新pre*/ for(int j=1;j<=sqrtn;++j) { if(c[j]>j)/*删除数,缩短序列*/ { int t=b[j]+1; while(pre[a[t]]>t) ++t; b[j]=t;c[j]--; } } for(int j=1;j<=sqrtn;++j) f[i]=min(f[i],f[b[j]]+j*j);/*更新f*/ } } int main() { input(); chuli(); cout<<f <<endl; return 0; } /*这个题目既然不以划分次数为状态,那么可以考虑,划分序列的长度*/
相关文章推荐
- CentOS 7 编译安装 Code::Blocks
- 调整变速器前拨详细图文教程
- 接口和抽象类
- Shell使用技巧之后台进程退出
- Tomcat Cannot assign requested address: JVM_Bind
- angularjs select option默认值
- cuda,day-13,tensorcalc张量计算
- LeetCode OJ 99. Recover Binary Search Tree
- 枚举
- swift 往系统日历中添加提醒事项
- iOS开发中variable is not assignable missing block的解决办法
- tornado 数据库初始化
- Web Architecture Basic idea
- android matrix 详解与进阶(一)
- EPT分区表
- 解决IndexOutOfBoundsException: Inconsistency detected. Invalid view holder adapter
- Java异常
- 语音情感数据库&python实现文件名的批量更改
- PHP教程,Linux教程光盘
- 上半身检测