题意:

给你一个长度为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)的更多相关文章

  1. HDU 6240 Server(2017 CCPC哈尔滨站 K题,01分数规划 + 树状数组优化DP)

    题目链接  2017 CCPC Harbin Problem K 题意  给定若干物品,每个物品可以覆盖一个区间.现在要覆盖区间$[1, t]$. 求选出来的物品的$\frac{∑a_{i}}{∑b_ ...

  2. 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 ...

  3. 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 ...

  4. 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 ...

  5. 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 ...

  6. 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 ...

  7. The 2015 China Collegiate Programming Contest -ccpc-c题-The Battle of Chibi(hdu5542)(树状数组,离散化)

    当时比赛时超时了,那时没学过树状数组,也不知道啥叫离散化(貌似好像现在也不懂).百度百科--离散化,把无限空间中无限的个体映射到有限的空间中去,以此提高算法的时空效率. 这道题是dp题,离散化和树状数 ...

  8. hdu5542 The Battle of Chibi【树状数组】【离散化】

    The Battle of Chibi Time Limit: 6000/4000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Othe ...

  9. 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 ...

随机推荐

  1. Laya 踩坑日记-BitmapFont 不显示空格

    项目中有用到艺术字,美术通过 bmfont64 将字体导给我了,结果发现在应用上 空格不显示 如图: 今天去深究了一下这个问题,发现是底层没封装好,然后自己改了一下下面是改过的 BitmapFont ...

  2. LeetCode141-环形链表检测

    题目 给定一个链表,判断链表中是否有环. 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环. 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置 ...

  3. three.js 之cannon.js物理引擎

    今天郭先生说的是一个物理引擎,它十分小巧并且操作简单,没错他就是cannon.js.这些优点都源自于他是基于js编写的,对于js使用者来说cannon.js拥有其他物理引擎没有的纯粹性.从学习成本来看 ...

  4. 基于HBuilderX+UniApp+ColorUi+UniCloud 优宝库 开发实战(一)

    1.   优宝库介绍 优宝库是基于阿里妈妈.淘宝联盟 淘宝商品Api,前端使用HBuilderX + UniApp + ColorUi,后端采用UniClound 精选淘宝商品进行推荐的App程序.下 ...

  5. Python 身份证校验代码

    Python 身份证校验代码 居民身份证bai编号识别 1.身份证编码规则如下:根据[中华人民共和国国家标准GB11643-1999]中有关公民身份号码的规定,公民身份号码是特征组合码,由十七位数字本 ...

  6. Django实现文件在本地的存储和读取

    需求介绍:将图片存入本地的电脑文件夹中,将图片的路径保存到数据库,然后通过数据库的路径读取文件: 1.文件的存入: 前端文件: <form class="form-horizontal ...

  7. 三. SpringCloud服务注册与发现

    1. Eureka 1.1 Eureka理解 什么是服务治理 Spring Cloud封装了Netflix公司开发的Eurkeka模块来实现服务治理 在传统的rpc远程调用框架中,管理每个服务与服务之 ...

  8. C#高级编程第11版 - 第四章 索引

    [1]4.2 继承的类型 1.C#不支持类的多继承,但它支持一个接口继承自多个接口. 2.单继承:单继承允许一个类继承自另外一个基类,C#支持. 3.多级继承:多级继承允许创建一个类继承自它的父类,而 ...

  9. map 传递给函数的代价

    https://github.com/unknwon/the-way-to-go_ZH_CN/blob/master/eBook/08.1.md map 传递给函数的代价很小:在 32 位机器上占 4 ...

  10. from unittest import TestCase

    from unittest import TestCaseBigInteger/Big_Integer.py at master · YulitaGap/BigInteger https://gith ...