【动态规划+高精度】mr360-定长不下降子序列
【题目大意】
韵哲君发现自己的面前有一行数字,当她正在琢磨应该干什么的时候,这时候,陈凡老师从天而降,走到了韵哲君的身边,低下头,对她耳语了几句,然后飘然而去。
陈凡老师说了什么呢,陈凡老师对韵哲君说了这些话:“还记得我传授给你的不下降子序列吗?你现在只要找出一定长度的不下降子序列的种数,你就完成任务了。”
你也来做做这个活动吧?
输入格式 Input Format
第一行有两个整数N(0<N<=200),M(0<M<=20);
N表示给出多少个整数,M表示给出的定长;
第二行有N个整数,对于每个数字(-10000<=T[i]<=10000)。
输出格式 Output Format
输出一个整数,在给出的数列中定长不下降子序列的种数。
样例输入 Sample Input
10 5
1 2 3 4 5 6 7 8 9 10
样例输出 Sample Output
252
时间限制 Time Limitation
2s(对于高精度版)
【思路】
动态规划,设置数组f[i][j]表示以第i个数字为末位,长度为j的不下降子序列种类数。设置三重循环,第一重表示以第i个数字为末位,第二重j表示当前要取的不下降子序列长度,第三重k枚举这个不下降子序列的倒数第二个数字。如果a[i]≥a[k],则f[i][j]=f[i][j]+f[k][j-1]。
要注意的是,最后输出结果不是f[n][m],而是所有f[i][m]的累加!我因为这个一开始错了好久…
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
const int MAXN=+;
struct node
{
int num[];
int len;
};
int n,m;
int a[MAXN];
node f[MAXN][MAXN/]; void init()
{
scanf("%d%d",&n,&m);
for (int i=;i<n;i++) scanf("%d",&a[i]);
for (int i=;i<n;i++)
for (int j=;j<=m;j++)
{
memset(f[i][j].num,,sizeof(f[i][j].num));
if (j==)
{
f[i][j].num[]=;
f[i][j].len=;
}
else f[i][j].len=;
}
} void doadd(int a[],int b[],int &la,int lb)
{
int leng=max(la,lb);
int temp[];
memset(temp,,sizeof(temp));
for (int p=;p<leng;p++)
{
temp[p]+=a[p]+b[p];
/*由于是先进行进位的,这里不是将a[p]+b[p]赋值,而是累加在temp[p]上面*/
temp[p+]=temp[p]/;
temp[p]=temp[p]%;
}
if (temp[leng]>) leng++;
la=leng;
for (int p=;p<leng;p++) a[p]=temp[p];
} void dp()
{
for (int i=;i<n;i++)/*以第i个数为末位*/
for (int j=;j<=min(i+,m);j++)/*长度为j,只需取到i+1和m中较小的一个即可*/
for (int k=j-;k<i;k++)/*前一个数字为k,只需从能够取到j-1长度的那一位,即j-2开始*/
if (a[i]>=a[k])
doadd(f[i][j].num,f[k][j-].num,f[i][j].len,f[k][j-].len);/*f[i][j].num+=f[k][j-1].num*/
} void print()
{
int ans[];
memset(ans,,sizeof(ans));
int lans=; for (int i=m-;i<n;i++) doadd(ans,f[i][m].num,lans,f[i][m].len);
/*不是直接输出f[n-1][m],而是要将f[i][m]进行累加*/
for (int i=lans-;i>=;i--) cout<<ans[i];cout<<endl;
} int main()
{
freopen("mr360.in1","r",stdin);
freopen("mr360.ou1","w",stdout);
init();
dp();
print();
return ;
}
【动态规划+高精度】mr360-定长不下降子序列的更多相关文章
- Luogu 1020 导弹拦截(动态规划,最长不下降子序列,二分,STL运用,贪心,单调队列)
Luogu 1020 导弹拦截(动态规划,最长不下降子序列,二分,STL运用,贪心,单调队列) Description 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺 ...
- 动态规划——最长不下降子序列(LIS)
最长不降子序列是这样一个问题: 下面介绍动态规划的做法. 令 dp[i] 表示以 A[i] 结尾的最长不下降序列长度.这样对 A[i] 来说就会有两种可能: 如果存在 A[i] 之前的元素 A[j] ...
- HDU 6357.Hills And Valleys-字符串非严格递增子序列(LIS最长非下降子序列)+动态规划(区间翻转l,r找最长非递减子序列),好题哇 (2018 Multi-University Training Contest 5 1008)
6357. Hills And Valleys 自己感觉这是个好题,应该是经典题目,所以半路选手补了这道字符串的动态规划题目. 题意就是给你一个串,翻转任意区间一次,求最长的非下降子序列. 一看题面写 ...
- 【动态规划】【二分】【最长不下降子序列】洛谷 P1020 导弹拦截
最长不下降子序列的nlogn算法 见 http://www.cnblogs.com/mengxm-lincf/archive/2011/07/12/2104745.html 这题是最长不上升子序列,倒 ...
- 动态规划 ---- 最长不下降子序列(Longest Increasing Sequence, LIS)
分析: 完整 代码: // 最长不下降子序列 #include <stdio.h> #include <algorithm> using namespace std; ; in ...
- 算法进阶 (LIS变形) 固定长度截取求最长不下降子序列【动态规划】【树状数组】
先学习下LIS最长上升子序列 看了大佬的文章OTZ:最长上升子序列 (LIS) 详解+例题模板 (全),其中包含普通O(n)算法*和以LIS长度及末尾元素成立数组的普通O(nlogn)算法,当然还 ...
- 【C/C++】最长不下降子序列/动态规划
#include <iostream> #include <vector> using namespace std; int main() { //输入 int tmp; ve ...
- 最长不下降子序列的O(n^2)算法和O(nlogn)算法
一.简单的O(n^2)的算法 很容易想到用动态规划做.设lis[]用于保存第1~i元素元素中最长不下降序列的长度,则lis[i]=max(lis[j])+1,且num[i]>num[j],i&g ...
- P2766 最长不下降子序列问题 网络流
link:https://www.luogu.org/problemnew/show/P2766 题意 给定正整数序列x1,...,xn . (1)计算其最长不下降子序列的长度s. (2)计算从给定的 ...
随机推荐
- JS 本地属性与继承属性
判断是否拥有某种属性 1.in 运算符 var obj = {name:'jack'}; alert('name' in obj); // --> true alert('toString' i ...
- A题 hdu 1235 统计同成绩学生人数
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1235 统计同成绩学生人数 Time Limit: 2000/1000 MS (Java/Others) ...
- (二十一)Makefile例子
ROOT_PROJECT = .DIR_INC = -I$(ROOT_PROJECT)/include -I$(ROOT_PROJECT)/include/NE10 DIR_BIN = $(ROOT_ ...
- ERROR 1682 (HY000)
ERROR 1682 (HY000) xtrabackup 恢复数据库后,出现1682错: root@localhost [(none)]>show global variables like ...
- 【bzoj4868】期末考试
我还第一次见到省选考三分……? #include<bits/stdc++.h> #define N 200005 using namespace std; typedef long lon ...
- swift中闭包的循环引用
首先我们先创造一个循环引用 var nameB:(()->())? override func viewDidLoad() { super.viewDidLoad() let bu = UIBu ...
- JQUERY 提取多个元素 a img 的 src href
<div class="abc"><a href="1.html"><img src="1.jpg"/> ...
- 【python】发送邮件
从网上找了一些用python发邮件的教程,学习一下: 1.发送普通的文本邮件 http://www.cnblogs.com/xiaowuyi/archive/2012/03/17/2404015.ht ...
- Freemarker中JS取Data-model的值的问题
不能在表达式中使用js变量,比如: var key = 1; var value = "${stateMap[key]}"; 因为Freemarker是在服务器端进行解析的,此时j ...
- JMeter 中 HTTP Cookie 管理器的使用
根据 web 应用的复杂度你可以选择创建两种类型的 JMeter 测试计划:面向点击数的或面向场景的. 创建一个面向点击数的测试计划你需要有中值统计.这些统计要包含你的应用每秒应该处理多少个独立请求的 ...