acwing 297. 赤壁之战 树状数组优化DP 寒假集训
题目链接
想要求长度为M的子序列,我们可以拿DP方程来计算,并且这个DP也是比较好看出来的DP[i][j]代表着i后j位置中的所有长度为j的子序列,递推方程为
for(int i=1;i<=n;i++){for(int j=2;j<=m;j++){for(int k=1;k<i;k++){if(a[k]<a[i]) dp[i][j]+=dp[k][j-1]}}}
}
的一个三重循环,但是n^3的暴力一定是会超时的,所以我们可以用树状数组来优化一个前缀和的过程,每次累加过后记得单点修改以免多次被计算。
#include<bits/stdc++.h>
using namespace std;
#define lowbit(x) x&(-x)
const int maxn= 1010,mod=1e9+7;
int n,m;
int a[maxn],nums[maxn],cnt,tr[maxn];
int dp[maxn][maxn];
inline void add(int x,int v){while(x<=cnt){tr[x]=(tr[x]+v)%mod;x+=lowbit(x);}
}
inline int query(int x){int ans=0; while(x>0){ans=(ans+tr[x])%mod;x-=lowbit(x);}return ans;
}
int main(){int t;scanf("%d",&t);int cas=0;while(t--){scanf("%d%d",&n,&m);cnt=0;for(int i=1;i<=n;i++){scanf("%d",&a[i]);nums[cnt++]=a[i];}sort(nums,nums+cnt);cnt=unique(nums,nums+cnt)-nums;for(int i=1;i<=n;i++)a[i]=lower_bound(nums,nums+cnt,a[i])-nums+1;for(int i=1;i<=n;i++) dp[i][1]=1;for(int j=2;j<=m;j++){for(int i=1;i<=cnt;i++) tr[i]=0;for(int i=1;i<=n;i++){dp[i][j]=query(a[i]-1);add(a[i],dp[i][j-1]);}}int res=0;for(int i=1;i<=n;i++)res=(res+dp[i][m])%mod;printf("Case #%d: %d\n",++cas,res);}return 0;
}
acwing 297. 赤壁之战 树状数组优化DP 寒假集训相关推荐
- 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株,它们的高度参差不齐.方伯伯认为单调不下降序列很美,所以他决定先把一些玉米拔高,再把破坏美感的玉米拔除掉,使得剩 ...
- bzoj 1264: [AHOI2006]基因匹配Match (树状数组优化dp)
链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1264 思路: n大小为20000*5,而一般的dp求最长公共子序列复杂度是 n*n的,所以我 ...
- hdu 5542(树状数组优化dp)
题意: 求n个数中长度为m的上升子序列的个数 解题思路:dp[i][j]表示第i个数长度为j的上升序列的个数.dp[i][j] = sum{dp[k][j-1] | a[k] < a[i]},这 ...
- hdu 4991(树状数组优化dp)
Ordered Subsequence Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Othe ...
- 【HDU - 6447】YJJ's Salesman(降维dp,树状数组优化dp)
题干: YJJ is a salesman who has traveled through western country. YJJ is always on journey. Either is ...
- HDU 6447 YJJ's Salesman(树状数组优化DP + 离散化)
HDU 6447 YJJ's Salesman 题目 给一个二维数组,从(0,0)走到(1e9, 1e9).每次只能走右,下,右下,三个方向.其中只有通过右下走到特定给出的点(村庄)时才会获得分值.问 ...
- CF1621G Weighted Increasing Subsequences(离散化+树状数组优化dp+栈维护后缀最大值+计数)
problem luogu-link solution 显然单独考虑每个 iii 的贡献,即被多少个合法上升子序列包含. 令 x=max{j∣j>i∧aj>ai}x=\max\{j\ | ...
最新文章
- CNN 究竟“看”到了什么?曲线检测器是否为可解释性带来了出路?
- 5、Scala模式匹配
- 《虚拟机深入应用实践》已经出版
- SharePoint服务器如果需要安装杀毒软件, 需要注意什么?
- Android开发二 什么是Android
- Spring有几种事务处理方式?举例说明
- [转载]Unix 高手的另外 10 个习惯
- 汇编语言(八)之删除数组中为零的元素
- 数据类型、常量、变量
- 深度学习经典算法 | 蚁群算法解析
- uploadify一次上传多个图片:效果展示
- Net系列框架-Dapper+AutoFac 基于接口
- 一些用JAVA实现的小题目
- 二级mysql刷题_计算机二级通手机版(计算机二级刷题软件)V1.1 简化版
- 3万字细说数据仓库体系(建议收藏)
- 曲率、曲率(对弧长)的导数以及曲率导数(对弧长)的导数的计算
- keil软件下载安装与新建工程
- html5 show 案例
- DevData Talks | 张乐、茹炳晟、应阔浩、任晶磊:研发效能实践的2022年复盘和展望
- 自定义控件 自定义属性_自定义您的外壳