博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU 1160 FatMouse's Speed (最长有序的上升子序列)
阅读量:5056 次
发布时间:2019-06-12

本文共 1324 字,大约阅读时间需要 4 分钟。

题意:给你一系列个w,s。要你找到最长的n使得

W[m[1]] < W[m[2]] < ... < W[m[n]]

and 


S[m[1]] > S[m[2]] > ... > S[m[n]]

即在这n个w,s中满足w[i]<w[j]&&s[i]>s[j],要求:体重严格递增,速度严格递减,原始顺序不定

首先将s从大到小排序,即顺数固定后转化为最长上升子序列问题.

案例:

 
6008 1300 6000 2100 500 2000 1000 4000 1100 3000 6000 2000 8000 1400 6000 1200 2000 1900
 

Sample Output
 
4 4 5 9 7

1000 4000

1100 3000

2000 1900

8000 1400

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;#define INF 999999999#define eps 1e-4#define LL __int64#define maxn 26#define mol 1000000007#define N 505#define M 50010struct node{ int v,s,num;}p[1105];int pre[1105];//路径保存pre[i]表示 i 的前一个数int cmp(node a,node b){ return a.s>b.s;}void out(int k)//递归输出{ if(pre[k]==-1) { printf("%d\n",k); return; } out(pre[k]); printf("%d\n",k);}int main(){ int n=1,dp[1105]; while(~scanf("%d%d",&p[n].v,&p[n].s)) { p[n].num=n; n++; } sort(p+1,p+n+1,cmp); for(int i=1;i
p[i].s&&p[j].v
maxx) { maxx=dp[j]; index=p[j].num; } } } dp[i]=maxx+1; pre[p[i].num]=index; if(dp[i]>ans) { ans=dp[i]; k=p[i].num; } } printf("%d\n",ans); out(k); return 0;}/*6008 13006000 2100500 20001000 40001100 30006000 20008000 14006000 12002000 1900*/

转载于:https://www.cnblogs.com/zsychanpin/p/7141190.html

你可能感兴趣的文章
一个小的日常实践——高速Fibonacci数算法
查看>>
机器学些技法(9)--Decision Tree
查看>>
drf权限组件
查看>>
输入月份和日期,得出是今年第几天
查看>>
Centos6.4安装JDK
查看>>
【linux】重置fedora root密码
查看>>
pig自定义UDF
查看>>
Kubernetes 运维学习笔记
查看>>
Spark MLlib 之 Naive Bayes
查看>>
spring security 11种过滤器介绍
查看>>
学习网址
查看>>
前端表格插件datatables
查看>>
内部类
查看>>
树链剖分入门
查看>>
图解算法时间复杂度
查看>>
UI_搭建MVC
查看>>
一个样例看清楚JQuery子元素选择器children()和find()的差别
查看>>
代码实现导航栏分割线
查看>>
Windows Phone开发(7):当好总舵主 转:http://blog.csdn.net/tcjiaan/article/details/7281421...
查看>>
VS 2010打开设计器出现错误
查看>>