hdu5125 他说的是n个人每个人都有两个气球a,b,气球各自都有相应的体积,现在让他们按照序号排列好来,对他们的a气球体积值计算最长上升子序列,对于这整个排列来说有m次机会让你将a气球替换成b气球(允许不使用完),问最后的最长上升子序列 的长度是多少,哈哈,当然用dp的思想我们很容易就能知道状态的转移 dp[1000][1000][2],但是苦于状态转移的复杂度太大了达到了 n*n*m肯定受不了,那好我们可以列出这个方程的转移方法
(0表示a气球1为b气球)
dp[i][j][0]=max(  dp[k][j][0]     +1(a[k]<a[i]) , dp[k][j][j]     +1(b[k]<a[i]) )0<=k<i 
dp[i][j][1]=max(  dp[k][j-1][0] +1(a[k]<b[i]) , dp[k][j-1][1] +1(b[k]<b[i])  )0<=k<i
想想优化方法 看来还是需要有换个想法的能力 啊 !
通过建立m棵树状数组 第j棵树 表示 使用了 j 个 能 量 的 时 候 每个位置所能到达的最高点,说清楚一点就是讲这n*2个气球体积进行离散,得到了树状数组的每个节点从第0个人枚举到第n-1个,比如到达了第i个人 那么 到达他时使用了j个机会的 方案是不是 就是去找比ai(假设离散后在k这个位置)小的那些气球使用j个机会时达到的最长序列加1呢,好那么现就使用树状数组去计算出前k-1 项的 最大值S,然后将S这个值插入当前这个树状数组中 ,那么现在 我们考虑使用b气球可以去j-1 这棵树上去找 然后得到的值加1 插入第j棵树上,哇这样很完美啊! 瞬间将复杂度减了2个0,这样一直不断地做下去直到结束.
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <string.h>
using namespace std;
const int maxn=;
int a[maxn],b[maxn];
int c[maxn][maxn*],h[maxn*],L;
int lowbit(int x){
return x&(-x);
}
void add(int loc, int floor,int v){
while(loc<=L){
c[floor][loc]=max(v,c[floor][loc]);
loc+=lowbit(loc);
}
}
int sum(int loc, int floor){
int ans=;
while(loc>){
ans=max(c[floor][loc],ans);
loc-=lowbit(loc);
}
return ans;
} int main()
{
int cas;
scanf("%d",&cas);
while(cas--){
int n,m;
scanf("%d%d",&n,&m);
L=;
for(int i=; i<n; ++i){
scanf("%d%d",&a[i],&b[i]);
h[L++]=a[i]; h[L++]=b[i];
}
memset(c,,sizeof(c));
sort(h,h+L);
L=unique(h,h+L)-h;
int ans=;
for(int i=; i<n; ++i){
int loca = lower_bound(h,h+L,a[i])-h+;
int locb = lower_bound(h,h+L,b[i])-h+;
int val;
for(int j=min(i+,m);j>; j--){
val = sum(loca-,j);
ans=max(ans,val+);
add(loca,j,val+);
val = sum(locb-,j-);
ans=max(ans,val+);
add(locb,j,val+);
}
val = sum(loca-,);
ans=max(ans,val+);
add(loca,,val+);
}
printf("%d\n",ans);
}
return ;
}

hdu5125 树状数组+dp的更多相关文章

  1. codeforces 597C (树状数组+DP)

    题目链接:http://codeforces.com/contest/597/problem/C 思路:dp[i][j]表示长度为i,以j结尾的上升子序列,则有dp[i][j]= ∑dp[i-1][k ...

  2. hdu 4622 Reincarnation trie树+树状数组/dp

    题意:给你一个字符串和m个询问,问你l,r这个区间内出现过多少字串. 连接:http://acm.hdu.edu.cn/showproblem.php?pid=4622 网上也有用后缀数组搞得. 思路 ...

  3. Codeforces 597C. Subsequences (树状数组+dp)

    题目链接:http://codeforces.com/contest/597/problem/C 给你n和数(1~n各不同),问你长为k+1的上升自序列有多少. dp[i][j] 表示末尾数字为i 长 ...

  4. HDU2227Find the nondecreasing subsequences(树状数组+DP)

    题目大意就是说帮你给出一个序列a,让你求出它的非递减序列有多少个. 设dp[i]表示以a[i]结尾的非递减子序列的个数,由题意我们可以写出状态转移方程: dp[i] = sum{dp[j] | 1&l ...

  5. CodeForces - 314C Sereja and Subsequences (树状数组+dp)

    Sereja has a sequence that consists of n positive integers, a1, a2, ..., an. First Sereja took a pie ...

  6. HDU 6348 序列计数 (树状数组 + DP)

    序列计数 Time Limit: 4500/4000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total Subm ...

  7. [Codeforces261D]Maxim and Increasing Subsequence——树状数组+DP

    题目链接: Codeforces261D 题目大意:$k$次询问,每次给出一个长度为$n$的序列$b$及$b$中的最大值$maxb$,构造出序列$a$为$t$个序列$b$连接而成,求$a$的最长上升子 ...

  8. 【XSY2727】Remove Dilworth定理 堆 树状数组 DP

    题目描述 一个二维平面上有\(n\)个梯形,满足: 所有梯形的下底边在直线\(y=0\)上. 所有梯形的上底边在直线\(y=1\)上. 没有两个点的坐标相同. 你一次可以选择任意多个梯形,必须满足这些 ...

  9. hdu5489 树状数组+dp

    2015-10-06 21:49:54 这题说的是个给了一个数组,然后删除任意起点的一个连续的L个数,然后求最长递增子序列<是递增,不是非递减>,用一个树状数组维护一下就ok了 #incl ...

随机推荐

  1. 实验一:Java开发环境的熟悉

    实验一:Java开发环境的熟悉 一.实验一-1 在码云中建立"20165317exp1"的项目. 从git中下载该项目. 在"20165317exp1"目录下建 ...

  2. jquery validate强大的jquery表单验证插件

    jquery validate的官方演示和文档地址: 官方网站:http://jqueryvalidation.org/ 官方演示:http://jqueryvalidation.org/files/ ...

  3. linux crypt()函数使用总结

    原型: char *crypt(const char *key, const char *salt); 标准说明: crypt()算法会接受一个最长可达8字符的密钥(即key),并施以数据加密算法(D ...

  4. C# Asp.net 修改Ueditor编辑器上传图片保存路径

    默认情况下Ueditor图片上传的保存路径是在/ueditor/net/upload/目录下,(如:http://localhost/ueditor/net/upload/123.png), 但是有时 ...

  5. python-面向对象-07_继承

    继承 目标 单继承 多继承 面向对象三大特性 封装 根据 职责 将 属性 和 方法 封装 到一个抽象的 类 中 继承 实现代码的重用,相同的代码不需要重复的编写 多态 不同的对象调用相同的方法,产生不 ...

  6. Too many connections解决方法

    在工作中,大家或许常常遇到Too many connections这个错误,这时作为DBA想进数据库管理都进不去,是非常尴尬的一件事情.当然有同学说可以修改配置文件,但是修改配置文件是需要重启mysq ...

  7. css自动换行如何设置?url太长会撑开页面

    我们更新文章时如果有引用其他文章一般会带一个原文url,但这个链接如果太长的话会把内容的版块撑开,整个排版乱了.那我们能不能设置css自动换行呢?如下图所示,其实只要两个样式就能搞定 word-wra ...

  8. 理解Spark里的闭包

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/rlnLo2pNEfx9c/article/details/80650309 闭包的概念例如以下图: ...

  9. MathWorks.MATLAB.NET.Arrays.MWArray”的类型初始值设定项引发异常 解决方法

    原因 用的是matlab7运行时,后面又安装了matlab11,后面又重新安装了matlab7运行时,c盘下就有二个运行时的版本了,程序引用了后面的那个,编译后就出上面的问题 解决方法 1重新引用上面 ...

  10. NYOJ 92

    1.深搜(会爆栈,通过开全局栈模拟递归) 爆栈代码 # include<iostream> # include<string> # include<string.h> ...