代码:

#include <stdio.h>
#include <memory.h>
#include <math.h>
#include <string>
#include <vector>
#include <set>
#include <stack>
#include <queue>
#include <algorithm>
#include <map>#define I scanf
#define OL puts
#define O printf
#define F(a,b,c) for(a=b;a<c;a++)
#define FF(a,b) for(a=0;a<b;a++)
#define FG(a,b) for(a=b-1;a>=0;a--)
#define LEN 101
#define MAX 1<<30
#define V vector<int>using namespace std;int a[LEN];
int dp[LEN];
int n;void printAns(int cnt,int pos,V vec){vec.insert(vec.begin(),a[pos]);int obj=dp[pos--]-1;while(pos>0){if(dp[pos]==obj)printAns(cnt-1,pos,vec);pos--;}if(cnt==1){int i;FF(i,vec.size())O("%d ",vec[i]);OL("");}
}void DP_n2(){int i,j,p;int ans=0;F(i,1,n+1){dp[i]=1;F(j,1,i){if(a[j]<a[i])dp[i]=max(dp[i],dp[j]+1);} if(dp[i]>ans){ans=dp[i];p=i;}}O("ans=%d p=%d\n序列 :\n",ans,p);F(i,1,n+1)O("%d ",a[i]) ;OL("\nDP数组 :");F(i,1,n+1)O("%d ",dp[i]) ;OL("");V vec;OL("所有LIS :");printAns(ans,p,vec);
} void DP_nLogn(){int i,j,top=0;F(i,1,n+1){if(top==0 || dp[top-1]<a[i]) dp[top++]=a[i];else{int pos=lower_bound(dp,dp+top,a[i])-dp;dp[pos]=a[i];}}printf("%d\n",top);OL("DP数组: ");F(i,0,top)O("%d ",dp[i]);OL("\n") ;
}
int main()
{
//dilworth定理:LIS 长度   等于  LIS 子序列 个数freopen("LIS.txt","r",stdin);int i,j;I("%d",&n);F(i,1,n+1){I("%d",&a[i]);}DP_nLogn();DP_n2();return 0;
}

View Code

测试数据:

11
1 3 7 6 8 5 3 2 7 2 9


OJ:导弹拦截

#include <stdio.h>
#include <memory.h>
#include <math.h>
#include <string>
#include <vector>
#include <set>
#include <stack>
#include <queue>
#include <algorithm>
#include <map>#define I scanf
#define OL puts
#define O printf
#define F(a,b,c) for(a=b;a<c;a++)
#define FF(a,b) for(a=0;a<b;a++)
#define FG(a,b) for(a=b-1;a>=0;a--)
#define LEN 100001
#define MAX 1<<30
#define V vector<int>using namespace std;int a[LEN];
int dp1[LEN];//increase
int dp2[LEN];//decreasebool cmp(int x,int y){return x>y;
}int main(){freopen("D:/CbWorkspace/动态规划/导弹拦截.txt","r",stdin);int i,n=0; while(I("%d",&a[++n])>0);n--;fill(dp2,dp2+n+1,MAX);int len1=0,len2=0;F(i,1,n+1){//记录递增dpint p1=upper_bound(dp1+1,dp1+1+n,a[i],cmp)-dp1;    //在递减序列中进行操作 //记录递减dp(初始化Inf)int p2=lower_bound(dp2+1,dp2+1+n,a[i])-dp2;        //在递增序列中进行操作 dp1[p1]=a[i] ;dp2[p2]=a[i] ;len1=max(len1,p1);len2=max(len2,p2);int s=0;}O("%d\n%d",len1,len2);return 0;
}

View Code


OJ : 合唱队形

#include <stdio.h>
#include <memory.h>
#include <math.h>
#include <string>
#include <vector>
#include <set>
#include <stack>
#include <queue>
#include <algorithm>
#include <map>#define I scanf
#define OL puts
#define O printf
#define F(a,b,c) for(a=b;a<c;a++)
#define FF(a,b) for(a=0;a<b;a++)
#define FG(a,b) for(a=b-1;a>=0;a--)
#define LEN 100001
#define MAX 1<<30
#define V vector<int>using namespace std;int dp1[LEN] ;
int dp2[LEN] ;
int a[LEN] ;
int max1[LEN] ;
int max2[LEN] ;bool cmp(int x,int y){return x>y;
}int main(){
//    freopen("D:/CbWorkspace/动态规划/合唱队形.txt","r",stdin);int n,i,j;I("%d",&n);FF(i,n)I("%d",&a[i]);int max_ans=0;FF(i,n){dp1[i]=1;FF(j,n){if(a[j]<a[i]){dp1[i]=max(dp1[i],dp1[j]+1);}}max_ans=max(max_ans,dp1[i]);max1[i]=max_ans;}max_ans=0;for(i=n-1;i>=0;i--){dp2[i]=1;for(j=n-1;j>i;j--){if(a[i]>a[j]){dp2[i]=max(dp2[i],dp2[j]+1);}}max_ans=max(max_ans,dp2[i]);max2[i]=max_ans;}int ans=0;FF(i,n-1){int t=max1[i]+max2[i+1];ans=max(ans,t);}O("%d",n-ans);return 0;
}

View Code

转载于:https://www.cnblogs.com/TQCAI/p/8428598.html

动态规划-最长不下降子序列相关推荐

  1. 动态规划 最长不下降子序列

    难点 状态:以A[i]结尾的最长不下降子序列 状态转移方程:dp[i] = max(1,dp[j]+1) 代码实现 #include<stdio.h>const int maxn = 10 ...

  2. 洛谷 - P2766 最长不下降子序列问题(最大流+动态规划+思维建边)

    题目链接:点击查看 题目大意:给出一个由n个数组成的序列,有三个子问题: 求出当前数列的最长不下降子序列的长度len 如果每个数最多只能使用一次,问最多可以组成多少个长度为len的最长不下降子序列 如 ...

  3. 动态规划之最长不下降子序列

    一.概念明确 先来看一串数字:(20,17,19,22,4,7,10,12,5,2,13) 1.序列:像以上排成一列的数字,我们叫它序列,其中每个数字,可以被称为一个元素. 2.子序列:将序列中的部分 ...

  4. 最长不下降子序列的O(n^2)算法和O(nlogn)算法

    转帖 最长不下降子序列的O(n^2)算法和O(nlogn)算法 最长不下降子序列(LIS:Longest Increasing Subsequence) //用句通俗的话说,我讲的很通俗易懂~~ 问题 ...

  5. 1045 Favorite Color Stripe(最长不下降子序列)

    1045 Favorite Color Stripe(最长不下降子序列) 题意:按照题目给出的颜色序列找出原颜色序列中对应的子序列,给出的颜色序列不需要在子序列中全部出现. 解法:根据给出的序列对相应 ...

  6. 最长不下降子序列(推广问题)

    最长不下降子序列问题的定义:在一个序列中,找到一个最长的子序列,其中这个序列是非递减的 我们可以把这个非递减推广,其实非递减就是一种顺序,那么我们可以把定义推广到:给出一个顺序序列.目标序列中,在目标 ...

  7. 最大流 ---- 最大不相交路径数 ---- P2766 最长不下降子序列问题(网络流24题)

    题目链接 最多不相交路径 这种问题变化比较多,但都能表示成以下形式: 已知一些路径,每个节点只能属于一条路径,求能选择多少条路径使它们不相交. 主要的方法是拆点,将一个点拆成两个,然后连边,容量表示该 ...

  8. 最长不下降子序列java代码_浅谈最长不下降子序列与最长上升子序列

    唔,最长不下降子序列与最长上升子序列曾是困扰蒟蒻多时的一个问题,应该也有一些人分不清这2个的求法吧. 首先n^2算法肯定是都能分清的,因为不下降和上升的区别是连续的2个能不能相等,只需要在判断的时候判 ...

  9. 【P2766】 最长不下降子序列问题

    题目描述 «问题描述: 给定正整数序列x1,...,xn . (1)计算其最长不下降子序列的长度s. (2)计算从给定的序列中最多可取出多少个长度为s的不下降子序列. (3)如果允许在取出的序列中多次 ...

  10. 洛谷2766:[网络流24题]最长不下降子序列问题——题解

    https://www.luogu.org/problemnew/show/P2766 给定正整数序列x1,...,xn . (1)计算其最长不下降子序列的长度s. (2)计算从给定的序列中最多可取出 ...

最新文章

  1. UVA1601万圣节的早上
  2. prototype极速应用1
  3. 使用ultramon调整任务栏高度
  4. 历时7周,当然了真正的安装时间没这么多,终于把集群安装好了
  5. Python 字典推导式 - Python零基础入门教程
  6. 快手:今年下架抄袭、搬运内容的违规视频20316个
  7. POJ NOI0107-06 合法 C 标识符【文本处理】
  8. 100个最常用的PHP函数(建议收藏)
  9. python 多线程测试_【Python】多线程网站死链检测工具
  10. 小程序-云开发-实现微信云支付功能
  11. Windows无法安装到磁盘磁盘具有MBR分区表的解决
  12. matlab小波变换学习入门
  13. asterisk meetme 会议实现
  14. MATLAB遇到问题:错误使用mex的解决办法
  15. 视频教程-微信公众号二维码签到和抽奖软件-微信开发
  16. 购房指南—新房交房注意事项细节有哪些
  17. vue3语法糖父子组件的通信
  18. VM虚拟机Ubuntu系统鼠标闪烁通用解决办法
  19. mysql semi-sync(半同步复制)
  20. 电网负荷调度三维组态软件V2.0

热门文章

  1. android a20 i2c 通信,Android程序运行分析——中等复杂程度的NTAG I2C Demo为例(二)...
  2. 营山天气预报软件测试,营山天气预报15天
  3. Kubernetes 小白学习笔记(31)--kubernetes云原生应用开发-istio架构和安装
  4. thinkphp 同时更新多条数据
  5. matlab单层感知器画线,MATLAB神经网络学习(1):单层感知器
  6. 基于SSM的房屋租赁系统
  7. 帆软报表多行多条数据写入表_超多种类的报表模板,填上数据就能用,全拿走!...
  8. vue之生命周期(beforeCreate,created,beforeMount,mounted,beforeUpdate,updated)
  9. JavaScript GET 和 POST 请求的区别详解
  10. LayaAir UI 组件 # Button 按钮