题意:

求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)相关推荐

  1. hdu 4991(树状数组优化dp)

    Ordered Subsequence Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Othe ...

  2. E. Pencils and Boxes (树状数组优化dp)

    传送门 1.题意 给出n个数,要求给这些数分组,每组不少于k个. 每组的数之间的差不能大于d.是否能够分组? 2.dp分析 先排序. f[i]f[i]f[i]表示[1~i]能够分组成功. 答案就是f[ ...

  3. Codeforces 629D Babaei and Birthday Cake(树状数组优化dp)

    题意: 线段树做法 分析: 因为每次都是在当前位置的前缀区间查询最大值,所以可以直接用树状数组优化.比线段树快了12ms~ 代码: #include<cstdio> #include< ...

  4. [SCOI2014]方伯伯的玉米田 //二维树状数组优化DP

    题目: 方伯伯在自己的农田边散步,他突然发现田里的一排玉米非常的不美.这排玉米一共有N株,它们的高度参差不齐.方伯伯认为单调不下降序列很美,所以他决定先把一些玉米拔高,再把破坏美感的玉米拔除掉,使得剩 ...

  5. HDU 6447 YJJ's Salesman(树状数组优化DP + 离散化)

    HDU 6447 YJJ's Salesman 题目 给一个二维数组,从(0,0)走到(1e9, 1e9).每次只能走右,下,右下,三个方向.其中只有通过右下走到特定给出的点(村庄)时才会获得分值.问 ...

  6. 【HDU - 6447】YJJ's Salesman(降维dp,树状数组优化dp)

    题干: YJJ is a salesman who has traveled through western country. YJJ is always on journey. Either is ...

  7. bzoj 1264: [AHOI2006]基因匹配Match (树状数组优化dp)

    链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1264 思路: n大小为20000*5,而一般的dp求最长公共子序列复杂度是 n*n的,所以我 ...

  8. acwing 297. 赤壁之战 树状数组优化DP 寒假集训

    题目链接 想要求长度为M的子序列,我们可以拿DP方程来计算,并且这个DP也是比较好看出来的DP[i][j]代表着i后j位置中的所有长度为j的子序列,递推方程为 for(int i=1;i<=n; ...

  9. CF1621G Weighted Increasing Subsequences(离散化+树状数组优化dp+栈维护后缀最大值+计数)

    problem luogu-link solution 显然单独考虑每个 iii 的贡献,即被多少个合法上升子序列包含. 令 x=max⁡{j∣j>i∧aj>ai}x=\max\{j\ | ...

最新文章

  1. 5个最佳的Android测试框架
  2. BZOJ4155 : [Ipsc2015]Humble Captains
  3. python3语法都相同吗_python2 与 python3 语法区别--转
  4. python distplot 图_Python可视化23 |seaborn.distplot公司单变量分布图(直方图|核密度图),23seaborndistplot...
  5. 3分钟简单了解 prototype 和 __proto__
  6. 用C语言程序实现黎曼和求定积分
  7. android 布局完成,Android自定义View设定到FrameLayout布局中实现多组件显示的方法 分享...
  8. 沿海产业基地与海润光伏共建产业园开工在即
  9. micropython教程nucleo-f767zi开发板_Micropython教程之TPYBoard开发板制作电子时钟(萝卜学科编程教育)...
  10. MySQL集群Cluster详解(一)——基本原理
  11. java完全自学手册pdf,附答案+考点
  12. CMD命令查看IP地址
  13. Shell管理工具流量分析-上(菜刀、蚁剑、冰蝎2.0流量分析)入侵检测、应急响应资料整理
  14. 数字图像处理:图像与编码
  15. redis列表list常用命令大全
  16. 将caj转换成pdf
  17. DPDK Release 21.11
  18. cs1.6服务器弹道优化,cs1.6弹道优化参数
  19. 第一个Python程序--Python
  20. 微信订阅号简易开发——小白攻略图文版

热门文章

  1. 神策数据独家丨100% 还原小仙炖 618 私域个性化服务实践
  2. “智能微尘”:助推物联网应用的关键
  3. Linux下使用Vi是方向键变乱码 退格键不能使用的解决方法
  4. Android--Retrofit+RxJava(二)
  5. DFT,DTFT,DFS,FFT区别
  6. 【转载】jQuery最佳实践
  7. 新 开通 自己 IT 博客
  8. cam db num
  9. intrigue more
  10. lec 3 of game design