The Bakery

题意:将N个数分成K块, 每块的价值为不同数字的个数, 现在求总价值最大。

题解:dp[i][j] 表示 长度为j 且分成 i 块的价值总和。 那么 dp[i][j] = max(dp[i-1][x]+右边的数的贡献) ( 1<=x < j )。 如果每次都从左到右for过去一定会TLE, 所以我们用线段树来优化这个查询的过程, 并且用滚动数组消去第二维空间。

每次新扫到一个数T, 他就会在上一个T的位置+1 --- 现在这个T的位置产生数目加一的贡献。

然后每次扫完一次, 都用DP的值去重新建树。并且将DP的对应位置往右移动一位, 这样下次访问这个位置就是  dp[i-1][x-1] + dp[1][x-j]的价值了。 (j 为现在的位置)。

代码:

 #include<bits/stdc++.h>
using namespace std;
#define LL long long
#define ULL unsigned LL
#define fi first
#define se second
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define max3(a,b,c) max(a,max(b,c))
const int INF = 0x3f3f3f3f;
const LL mod = 1e9+;
typedef pair<int,int> pll;
const int N = ;
int dp[N], tree[N<<], lazy[N<<], pos[N], last[N];
void Push_Up(int rt){
tree[rt] = max(tree[rt<<], tree[rt<<|]);
}
void Push_Down(int rt){
if(lazy[rt]){
lazy[rt<<]+=lazy[rt];
lazy[rt<<|]+=lazy[rt];
tree[rt<<]+=lazy[rt];
tree[rt<<|]+=lazy[rt];
lazy[rt] = ;
}
}
void Build(int l, int r, int rt){
lazy[rt] = ;
if(l == r){
tree[rt] = dp[l-];
return ;
}
int m = l+r >> ;
Build(lson);
Build(rson);
Push_Up(rt);
}
void Update(int L, int R, int l, int r, int rt){
if(L <= l && r <= R){
lazy[rt]++;
tree[rt]++;
return;
}
int m = l+r >> ;
Push_Down(rt);
if(L <= m) Update(L,R,lson);
if(m < R) Update(L,R,rson);
Push_Up(rt);
}
int Query(int L, int R, int l, int r, int rt){
if(L <= l && r <= R) return tree[rt];
int ans = ;
int m = l+r >> ;
Push_Down(rt);
if(L <= m) ans = max(ans, Query(L,R,lson));
if(m < R) ans = max(ans, Query(L,R,rson));
return ans;
}
int main(){
memset(pos, , sizeof(pos));
memset(last, , sizeof(last));
int n, k, t;
scanf("%d%d",&n,&k);
for(int i = ; i <= n; i++){
scanf("%d",&t);
last[i] = pos[t] + ;
pos[t] = i;
}
for(int i = ; i <= k; i++){
Build(,n,);
for(int j = ; j <= n; j++){
Update(last[j],j,,n,);
dp[j] = Query(,j,,n,);
}
}
printf("%d\n", dp[n]);
return ;
}

最新文章

  1. PHP生成二维码【谷歌API+qrcode+圆角Logo】
  2. hdu-5681 zxa and wifi(dp)
  3. java web项目中classes文件夹下的class和WEB-INF/lib中jar里的class文件加载顺序
  4. selendroid项目实战教程1
  5. Android模拟器对应的电脑快捷键说明
  6. (转) Class
  7. .NET Framework 4.5新特性
  8. Tomcat NIO 模型的实现
  9. 甘果移动老甘:移动互联网变迁中的App和小程序
  10. request接受表单数据中文乱码问题分析
  11. RN全局的变量,方法,全局类,全局类方法
  12. 团队项目用户验收评审——《WAP团队》
  13. TCP连接、Http连接与Socket连接
  14. [javaSE] IO流(FIle对象递归文件列表)
  15. 20155211实验2 Windows口令破解
  16. JSON_UNESCAPED_UNICODE
  17. 记录linux查询命令的一个网站
  18. 【uva 10294】 Arif in Dhaka (First Love Part 2) (置换,burnside引理|polya定理)
  19. 2018数学建模A题优秀论文:高温作业专用服装设计
  20. 之江学院第0届校赛 qwb去面试 (找规律)

热门文章

  1. 【iOS】duplicate symbols for architecture x86_64
  2. Spring中FactoryBean的作用和实现原理
  3. (通俗易懂小白入门)网络流最大流——EK算法
  4. 客户端埋点实时OLAP指标计算方案
  5. centos开发环境安装
  6. .net core web api部署到Linux系统CentOS 7
  7. Python 四大主流 Web 编程框架
  8. JavaWeb——Filter过滤器
  9. let 、const 、var、function声明关键字的新理解
  10. win10 将硬盘工作模式由IDE调整到AHCI模式