【动态规划+高精度】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)计算从给定的 ...
随机推荐
- 记一次Node项目的优化
这两天针对一个Node项目进行了一波代码层面的优化,从响应时间上看,是一次很显著的提升.一个纯粹给客户端提供接口的服务,没有涉及到页面渲染相关. 背景 首先这个项目是一个几年前的项目了,期间一直在新增 ...
- hdu 1869 六度分离(最短路floyd)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1869 六度分离 Time Limit: 5000/1000 MS (Java/Others) M ...
- 第一章: 文件句柄转化为 typeglob/glob 与文件句柄检测
#为了使在子例程中传递文件句柄不出问题 #我们要把文件句柄转为glob或typeglob #转为glob $fd = *MY_FILE; #转为typeblog $fd = \*MY_FILE; #两 ...
- mysql执行load_fle返回NULL的解决方法
mysql 版本: 5.7.18 问题: 在执行mysql 函数load_file时,该函数将加载指定文件的内容,存储至相应字段.如: SELECT LOAD_FILE("D:\aa.txt ...
- [How to]如何通过xib来自定义UIViewController
代码:https://github.com/xufeng79x/CreateControllerByXib 1.简介 UIViewController实例可以通过代码.storyborad或者xib方 ...
- [How to]使用自定义cell进行tableview的创建,适用于cell样式不发生变化的情况。
1.简介 在tableview中又默认的cell格式,其中组织如下: <截取自官网文档> 最终的在页面上默认的cell也只能像上述那样的显示效果,如果这种要是无法满足我们的界面要求,那么我 ...
- 让IE6支持css3,让 IE7、IE8 都支持CSS3
但凡是前端工程师,都知道IE6,IE7,IE8不支持.或者不完全支持CSS3的属性. CSS3 有很多很强大.绚丽的效果,比如,圆角,阴影,渐变透明,渐变背景,等等. 因为IE6时代,没有什么标准,而 ...
- 用JavaScript校验日期的合法性
校验表单时可能会遇到校验日期是否正确.可以利用JS的内置对象Date帮助我们完成日期校验. 思路是首先用被校验日期(假设为A,可能为字符串或数字)创建一个Date对象(假设为B). 然后判断A和B的年 ...
- java中的数组与集合相互转换
1.数组转换成集合 数组转换为集合,用Arrays.asList方法. public static void main(String[] args) { String[] arr = {"a ...
- [PAT] 1147 Heaps(30 分)
1147 Heaps(30 分) In computer science, a heap is a specialized tree-based data structure that satisfi ...