hdu 5542(树状数组优化dp)
题意:
求n个数中长度为m的上升子序列的个数
解题思路:dp[i][j]表示第i个数长度为j的上升序列的个数。dp[i][j] = sum{dp[k][j-1] | a[k] < a[i]},这里的时间复杂度有O(n³),会超时,所以这里要有优化。其实可以将a[i]离散化,对于每一个j,构造一个树状数组,这样求sum{dp[k][j-1]}就可以用树状数组的求和了,时间复杂度可以降为O(n²logn)。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<set>
#include<map>
using namespace std;const int maxn = 1005;
const int mod = 1e9+7;
int n,m,dp[maxn][maxn];
int a[maxn],tree[maxn][maxn];
set<int> Set;
map<int,int> Map;int lowbit(int x)
{return x & -x;
}void add(int i,int j,int c)
{while(j <= n){tree[i][j] = (tree[i][j] + c) % mod;j += lowbit(j);}
}int sum(int i,int j)
{int ans = 0;while(j > 0){ans = (ans + tree[i][j]) % mod;j -= lowbit(j);}return ans;
}int main()
{int t,cas = 1;scanf("%d",&t);while(t--){scanf("%d%d",&n,&m);Set.clear();Map.clear();for(int i = 1; i <= n; i++){scanf("%d",&a[i]);Set.insert(a[i]);}int cnt = 0;for(set<int>::iterator it = Set.begin(); it != Set.end(); it++)Map[*it] = ++cnt;memset(dp,0,sizeof(dp));memset(tree,0,sizeof(tree));for(int i = 1; i <= n; i++)for(int j = 1; j <= m; j++){if(j == 1) dp[i][j] = 1;else dp[i][j] = (dp[i][j] + sum(j-1,Map[a[i]]-1)) % mod;add(j,Map[a[i]],dp[i][j]);}int ans = 0;for(int i = 1; i <= n; i++)ans = (ans + dp[i][m]) % mod;printf("Case #%d: %d\n",cas++,ans);}return 0;
}
hdu 5542(树状数组优化dp)相关推荐
- hdu 4991(树状数组优化dp)
Ordered Subsequence Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Othe ...
- E. Pencils and Boxes (树状数组优化dp)
传送门 1.题意 给出n个数,要求给这些数分组,每组不少于k个. 每组的数之间的差不能大于d.是否能够分组? 2.dp分析 先排序. f[i]f[i]f[i]表示[1~i]能够分组成功. 答案就是f[ ...
- Codeforces 629D Babaei and Birthday Cake(树状数组优化dp)
题意: 线段树做法 分析: 因为每次都是在当前位置的前缀区间查询最大值,所以可以直接用树状数组优化.比线段树快了12ms~ 代码: #include<cstdio> #include< ...
- [SCOI2014]方伯伯的玉米田 //二维树状数组优化DP
题目: 方伯伯在自己的农田边散步,他突然发现田里的一排玉米非常的不美.这排玉米一共有N株,它们的高度参差不齐.方伯伯认为单调不下降序列很美,所以他决定先把一些玉米拔高,再把破坏美感的玉米拔除掉,使得剩 ...
- HDU 6447 YJJ's Salesman(树状数组优化DP + 离散化)
HDU 6447 YJJ's Salesman 题目 给一个二维数组,从(0,0)走到(1e9, 1e9).每次只能走右,下,右下,三个方向.其中只有通过右下走到特定给出的点(村庄)时才会获得分值.问 ...
- 【HDU - 6447】YJJ's Salesman(降维dp,树状数组优化dp)
题干: YJJ is a salesman who has traveled through western country. YJJ is always on journey. Either is ...
- bzoj 1264: [AHOI2006]基因匹配Match (树状数组优化dp)
链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1264 思路: n大小为20000*5,而一般的dp求最长公共子序列复杂度是 n*n的,所以我 ...
- acwing 297. 赤壁之战 树状数组优化DP 寒假集训
题目链接 想要求长度为M的子序列,我们可以拿DP方程来计算,并且这个DP也是比较好看出来的DP[i][j]代表着i后j位置中的所有长度为j的子序列,递推方程为 for(int i=1;i<=n; ...
- CF1621G Weighted Increasing Subsequences(离散化+树状数组优化dp+栈维护后缀最大值+计数)
problem luogu-link solution 显然单独考虑每个 iii 的贡献,即被多少个合法上升子序列包含. 令 x=max{j∣j>i∧aj>ai}x=\max\{j\ | ...
最新文章
- 5个最佳的Android测试框架
- BZOJ4155 : [Ipsc2015]Humble Captains
- python3语法都相同吗_python2 与 python3 语法区别--转
- python distplot 图_Python可视化23 |seaborn.distplot公司单变量分布图(直方图|核密度图),23seaborndistplot...
- 3分钟简单了解 prototype 和 __proto__
- 用C语言程序实现黎曼和求定积分
- android 布局完成,Android自定义View设定到FrameLayout布局中实现多组件显示的方法 分享...
- 沿海产业基地与海润光伏共建产业园开工在即
- micropython教程nucleo-f767zi开发板_Micropython教程之TPYBoard开发板制作电子时钟(萝卜学科编程教育)...
- MySQL集群Cluster详解(一)——基本原理
- java完全自学手册pdf,附答案+考点
- CMD命令查看IP地址
- Shell管理工具流量分析-上(菜刀、蚁剑、冰蝎2.0流量分析)入侵检测、应急响应资料整理
- 数字图像处理:图像与编码
- redis列表list常用命令大全
- 将caj转换成pdf
- DPDK Release 21.11
- cs1.6服务器弹道优化,cs1.6弹道优化参数
- 第一个Python程序--Python
- 微信订阅号简易开发——小白攻略图文版