南阳ccpc C题 The Battle of Chibi && hdu5542 The Battle of Chibi (树状数组优化+dp)
题意:
给你一个长度为n的数组,你需要从中找一个长度为m的严格上升子序列
问你最多能找到多少个
题解:
我们先对原序列从小到大排序,排序之后的序列就是一个上升序列
这里如果两个数相等的话,那么因为题目要我们求严格上升子序列,所以我们让这个数在数组中原来位置靠后的排序之后让它靠前(靠前也就是下标小)
我们dp方程:dp[i][j]表示截至到第i(这个i是按照没排序之前的下标)个元素,上升子序列长度为j的子序列能找到dp[i][j]个
dp转移方程:dp[i][j]=dp[1--i-1][j-1]
dp[1--i-1][j-1]就表示dp[1][j-1]+dp[2][j-1]+...+dp[i-1][j-1]
可以说就是求前缀和,这里用的是树状数组维护的
比如原序列为:3 11 5 2 6
排序后序列为:2 3 5 6 11
按照排序后这个顺序进行dp,当dp到11的时候,是dp[2][j]的值改变,序列中3,5,6的dp[i][j]中的i大于2,所以不会多求或者少求
而对于dp到6这个数,因为3,5,2这三个数在原序列中的位置就比它靠前,所以轮到求dp[5][j]的时候,2,3,5的dp值都已经求出来了
那么这个时候求出来的前缀和dp[1--4][j]就是正确的
这个自己可以模拟看下
代码:
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<queue>
#include<map>
#include<vector>
#include<cstring>
using namespace std;
const int mod=1e9+7;
const int maxn=1e3+5;
#define mem(a) memset(a,0,sizeof(a))
//求sum(dp[1-x][j])
int n,m,dp[maxn][maxn];
struct shudui
{
int id,val;
}que[maxn];
bool cmp(shudui x,shudui y)
{
if(x.val!=y.val)
return x.val<y.val;
return x.id>y.id; //如果两个val相等,因为题目要求严格递增,所以这样排序就可以满足题意
}
int lowbit(int x)
{
return x&(-x);
}
void update(int x,int y,int val) //更新包含dp[x][y]的
{ //后缀数组项
while(x<=n)
{
dp[x][y]=(dp[x][y]+val)%mod;
x+=lowbit(x);
}
}
int get_sum(int x,int y)
{
int sum=0;
while(x>0)
{
sum=(sum+dp[x][y])%mod;
x-=lowbit(x);
}
return sum;
}
int main()
{
int t,p=0;
scanf("%d",&t);
while(t--)
{
mem(dp);
scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i)
{
scanf("%d",&que[i].val);
que[i].id=i;
}
sort(que+1,que+1+n,cmp);
for(int i=1;i<=n;++i)
{
for(int j=1;j<=m;++j)
{
if(j==1)
update(que[i].id,j,1);
else //因为我们按照val排过序了,所以我们可以加上前缀和就行
{
int sum=get_sum(que[i].id-1,j-1);
update(que[i].id,j,sum);
}
}
}
printf("Case #%d: %d\n",++p,get_sum(n,m));
}
return 0;
}
南阳ccpc C题 The Battle of Chibi && hdu5542 The Battle of Chibi (树状数组优化+dp)的更多相关文章
- HDU 6240 Server(2017 CCPC哈尔滨站 K题,01分数规划 + 树状数组优化DP)
题目链接 2017 CCPC Harbin Problem K 题意 给定若干物品,每个物品可以覆盖一个区间.现在要覆盖区间$[1, t]$. 求选出来的物品的$\frac{∑a_{i}}{∑b_ ...
- HDU 5542 - The Battle of Chibi - [离散化+树状数组优化DP]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5542 Problem DescriptionCao Cao made up a big army an ...
- 2018 CCPC网络赛 1010 hdu 6447 ( 树状数组优化dp)
链接:http://acm.hdu.edu.cn/showproblem.php?pid=6447 思路:很容易推得dp转移公式:dp[i][j] = max(dp[i][j-1],dp[i-1][j ...
- HDU 6447 - YJJ's Salesman - [树状数组优化DP][2018CCPC网络选拔赛第10题]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6447 Problem DescriptionYJJ is a salesman who has tra ...
- 2015南阳CCPC C - The Battle of Chibi DP树状数组优化
C - The Battle of Chibi Description Cao Cao made up a big army and was going to invade the whole Sou ...
- HDU - 5542 The Battle of Chibi(LIS+树状数组优化)
The Battle of Chibi Cao Cao made up a big army and was going to invade the whole South China. Yu Zho ...
- The 2015 China Collegiate Programming Contest -ccpc-c题-The Battle of Chibi(hdu5542)(树状数组,离散化)
当时比赛时超时了,那时没学过树状数组,也不知道啥叫离散化(貌似好像现在也不懂).百度百科--离散化,把无限空间中无限的个体映射到有限的空间中去,以此提高算法的时空效率. 这道题是dp题,离散化和树状数 ...
- hdu5542 The Battle of Chibi【树状数组】【离散化】
The Battle of Chibi Time Limit: 6000/4000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Othe ...
- The Battle of Chibi(数据结构优化dp,树状数组)
The Battle of Chibi Cao Cao made up a big army and was going to invade the whole South China. Yu Zho ...
随机推荐
- 【Spring】Spring 入门
Spring 入门 文章源码 Spring 概述 Spring Spring 是分层的 Java SE/EE 应用全栈式轻量级开源框架,以 IOC(Inverse Of Control,反转控制)和 ...
- 【Flutter】容器类组件之填充
前言 Padding可以给其子节点添加填充(留白). 接口描述 class EdgeInsets extends EdgeInsetsGeometry { // 分别指定四个方向的填充 const E ...
- 剑指offer 查找和排序的基本操作:查找排序算法大集合
重点 查找算法着重掌握:顺序查找.二分查找.哈希表查找.二叉排序树查找. 排序算法着重掌握:冒泡排序.插入排序.归并排序.快速排序. 顺序查找 算法说明 顺序查找适合于存储结构为顺序存储或链接存储的线 ...
- 使用 C# 9 的records作为强类型ID - 初次使用
强类型ID 实体通常是整数,GUID或者string类型,因为数据库直接支持这些类型,但是,如果实体的ID的类型是一样的,比如都是整数的ID,这有可能会出现ID值传错的问题,看下边的示例. publi ...
- 克隆slave
在日常生活中,我们做的比较多的操作就是在线添加从库,比如线上有一主一丛两个数据库,由于业务的需要一台从库的读取量无法满足现在的需求,这样就需要我们在线添加从库,出于安全考虑,我们通常需要在从库上进行在 ...
- 【RAC】10grac添加节点,详细步骤
RAC物理结构 现在的RAC环境是二个节点: dbp,dbs, 这个实验就是添加节点dbi. dbp,dbs和dbi节点的信息规划如下: 服务器主机名 dbp dbs dbi 公共IP地址(eth0) ...
- 【Oracle】Oracle中chr()的含义
oracle中chr含义 CHR(10)和 CHR(13)--在oracle都为换行 chr(32)--表示空格 DECLARE v_a VARCHAR2(255); v_b VARCHAR2(255 ...
- SAP表的锁定与解锁
表的锁定模式有三种模式. lock mode有三种模式:分别是S,E,X.含义如下: S (Shared lock, read lock) E (Exclusive lock, wri ...
- 开发中的你的Git提交规范吗?
1. 前言 目前大部分公司都在使用Git作为版本控制,每个程序员每天都要进行代码的提交.很多开发者也包括我自己,有时候赶时间或者图省事,就这么提交: git commit -m "修改bug ...
- Matlab GUI学习总结
从简单的例子说起吧. 创建Matlab GUI界面通常有两种方式: 1,使用 .m 文件直接动态添加控件 2. 使用 GUIDE 快速的生成GUI界面显然第二种可视化编辑方法算更适合 ...