题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=1160

题意:两个子序列 一个是升序,一个是降序,求最长的子序列是多长,并输出路径。(答案不唯一)

思路都是一样的,不断的更新当前值,优化之前的值,只不过还要记录一下路径。

代码:(注释应该就可以看得懂了)//这注释,我给自己满分。。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
#define INF 0x3f3f3f3f
const int maxn=1e6+; struct mice
{
int w,v,r,l; ///分别是体重,速度,位置,它下一个小鼠的位置
} m[maxn];
int dp[maxn]; ///dp代表到第i位老鼠的时候,排序能达到的最大长度 int cmp(mice a,mice b) ///体重降序排列,速度升序排列
{
if(a.w==b.w) return a.v<b.v;
else return a.w>b.w;
} int main()
{
int x,y,k=;
while(scanf("%d%d",&x,&y)==)
{
k++;
m[k].w=x;
m[k].v=y;
m[k].r=k;
m[k].l=;
}
sort(m+,m++k,cmp);
memset(dp,,sizeof(dp)); m[].w=INF; ///初始化m[0];
m[].v=;
m[].r=;
m[].l=; int ans=; for(int i=; i<=k; i++)
{
for(int j=; j<i; j++)
{
if(m[j].w>m[i].w && m[j].v<m[i].v)
{
if(dp[j]+>=dp[i]) ///dp[j]>=dp[i]时很好理解
{ ///那么dp[j]+1==dp[i]呢,就是使序列等长时,当前的体重值最小;
dp[i]=dp[j]+; ///长度+1
m[i].l=j; ///排好顺序后,第i只老鼠的下只老鼠是j;
if(dp[i]>dp[ans]) ans=i; ///找到当前长度的最大时的位置
}
} ///因为体重是降序排列,所以越往后i就可能是排在最前面的
} ///其实这就是一个插入的过程
}
printf("%d\n",dp[ans]);
while(m[ans].l!=) ///i越大,位置越靠前,所以从m[ans].r 开始输出。
{
printf("%d\n",m[ans].r); ///输出当前位置的原本位置
ans=m[ans].l; ///找到下一个位置
}
printf("%d\n",m[ans].r); ///输出排序最后一个位置的原本位置
return ;
}

代码2:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
#define INF 0x3f3f3f3f
const int maxn=1e6+; struct mice
{
int w,v,r,l; ///分别是体重,速度,位置,它下一个小鼠的位置
} m[maxn];
int dp[maxn]; ///dp代表到第i位老鼠的时候,排序能达到的最大长度 int cmp(mice a,mice b) ///体重降序排列,速度升序排列
{
if(a.w==b.w) return a.v<b.v;
else return a.w>b.w;
} int main()
{
int x,y,k=;
while(scanf("%d%d",&x,&y)==)
{
k++;
m[k].w=x;
m[k].v=y;
m[k].r=k;
m[k].l=;
}
sort(m+,m++k,cmp);
memset(dp,,sizeof(dp)); m[].w=INF; ///初始化m[0];
m[].v=;
m[].r=;
m[].l=; int ans=; for(int i=; i<=k; i++)
{
for(int j=; j<i; j++)
{
if(m[j].w>m[i].w && m[j].v<m[i].v)
{
if(dp[j]+>dp[i])
{
dp[i]=dp[j]+; ///长度+1
m[i].l=j; ///排好顺序后,第i只老鼠的下只老鼠是j;
if(dp[i]>dp[ans]) ans=i; ///找到当前长度的最大时的位置
}
} ///因为体重是降序排列,所以越往后i就可能是排在最前面的
} ///其实这就是一个插入的过程
}
printf("%d\n",dp[ans]);
while(m[ans].l!=) ///i越大,位置越靠前,所以从m[ans].r 开始输出。
{
printf("%d\n",m[ans].r); ///输出当前位置的原本位置
ans=m[ans].l; ///找到下一个位置
}
printf("%d\n",m[ans].r); ///输出排序最后一个位置的原本位置
return ;
}

hdu1160 LIS变形的更多相关文章

  1. 九度 1557:和谐答案 (LIS 变形)

    题目描述: 在初试即将开始的最后一段日子里,laxtc重点练习了英语阅读的第二部分,他发现了一个有意思的情况.这部分的试题最终的答案总是如下形式的:1.A;2.C;3.D;4.E;5.F.即共有六个空 ...

  2. hdu 1087(LIS变形)

    Super Jumping! Jumping! Jumping! Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 ...

  3. UVA 437 巴比伦塔 【DAG上DP/LIS变形】

    [链接]:https://cn.vjudge.net/problem/UVA-437 [题意]:给你n个立方体,让你以长宽为底,一个个搭起来(下面的立方体的长和宽必须大于上面的长和宽)求能得到的最长高 ...

  4. HDU-1160.FatMouse'sSpeed.(LIS变形 + 路径打印)

    本题大意:给定一定数量的数对,每个数保存着一只老鼠的质量和速度,让你求出一个最长序列,这个序列按照质量严格递增,速度严格递减排列,让你输出这个序列的最长长度,并且输出组成这个最长长度的序列的对应的老鼠 ...

  5. UVa 1471 (LIS变形) Defense Lines

    题意: 给出一个序列,删掉它的一个连续子序列(该子序列可以为空),使得剩下的序列有最长的连续严格递增子序列. 分析: 这个可以看作lrj的<训练指南>P62中讲到的LIS的O(nlogn) ...

  6. hdu5773--The All-purpose Zero(LIS变形)

    题意:给一个非负整数的数列,其中0可以变成任意整数,包括负数,求最长上升子序列的长度. 题解:LIS是最简单的DP了,但是变形之后T^T真的没想到.数据范围是10^5,只能O(nlogn)的做法,所以 ...

  7. UVA1471( LIS变形)

    这是LIS的变形,题意是求一个序列中去掉某个连续的序列后,能得到的最长连续递增序列的长度. 用DP的解法是:吧这个序列用数组a来记录,再分别用两个数组f记录以i结尾的最长连续递增序列的长度,g[i]记 ...

  8. POJ 1836-Alignment(DP/LIS变形)

    Alignment Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 13465   Accepted: 4336 Descri ...

  9. poj 1836 LIS变形

    题目链接http://poj.org/problem?id=1836 Alignment Time Limit: 1000MS   Memory Limit: 30000K Total Submiss ...

随机推荐

  1. codeforces 460D Little Victor and Set(构造、枚举)

    最近的CF几乎都没打,感觉挺水的一个题,不过自己仿佛状态不在,看题解才知道做法. 输入l, r, k (1 ≤ l ≤ r ≤ 1012; 1 ≤ k ≤ min(106, r - l + 1)). ...

  2. 1616 最小集合 51NOD(辗转相处求最大公约数+STL)

    1616 最小集合 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题  收藏  关注 A君有一个集合. 这个集合有个神奇的性质. 若X,Y属于该集合,那么X与Y的最大 ...

  3. FileUpload控件使用初步

    FileUpload控件使用初步   FileUpload控件使用初步: 1.实现文件上传 protected void btnSubmit_click(object sender, EventArg ...

  4. 转载jQuery图片放大插件[twiPicZoom]

    转载http://xuzhihong1987.blog.163.com/blog/static/26731587201312821725913/ 功能说明: 双击查看大图,鼠标滚动放大缩小,能够切换到 ...

  5. io流对文件读写操作

    public static void main(String[] args) throws IOException { BufferedReader reader = new BufferedRead ...

  6. Linux下第一次使用MySQL数据库,设置密码

    在终端下输入:/etc/rc.d/init.d/mysqld status 查看MySQL状态,看看是否运行. 没有运行的话就输入:/etc/rc.d/init.d/mysqld start 这时,就 ...

  7. codevs 1702素数判定2

    Miller-Rabin算法实现,但是一直被判题程序搞,输入9999999999得到的结果分明是正确的但是一直说我错 #include <cstdio> #include <cmat ...

  8. js 闭包原理理解

    问题?什么是js(JavaScript)的闭包原理,有什么作用? 一.定义 官方解释:闭包是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分. 很显然 ...

  9. 《C#本质论》读书笔记(14)支持标准查询操作符的集合接口

      14.2.集合初始化器 使用集合初始化器,程序员可以采用和数组相似的方式,在集合的实例化期间用一套初始的成员来构造这个集合. 如果没有集合初始化器,就只有在集合实例化后才能显示添加到集合中--例如 ...

  10. ****php:require_once(dirname(__FILE__)."/./config_uc.php");

    Q:麻烦清楚地讲解一下这句的意思,具体路径是怎样的,这个文解在 根目录,如果我想放在根目录下的tieba文件夹里,应该怎么修改/./ 这个是表示什么? A: require_once(dirname( ...