hdu 1160 FatMouse's Speed
2016-04-07 10:32
288 查看
题意:输入若干对数,直到文件结束,每对数字有 w s, 找出最长的一个序列满足W[m[1]] < W[m[2]] < ... < W[m
] ,S[m[1]] > S[m[2]] > ... > S[m
] ,输出长度,且任意输出一条即可。
分析, 先按照w进行排序,然后找最长下降子序列,保存下父节点。
] ,S[m[1]] > S[m[2]] > ... > S[m
] ,输出长度,且任意输出一条即可。
分析, 先按照w进行排序,然后找最长下降子序列,保存下父节点。
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cstdlib> #include <ctime> using namespace std; const int oo = 1e9; struct Mouse { int w, s; int in; }m[1005]; bool cmp(Mouse a1, Mouse a2) { if(a1.w!=a2.w) return a1.w<a2.w; return a1.s>a2.s; } struct d { int x, pre; }dp[1005]; void print(int index) { if(index==-1) { return ; } print(dp[index].pre); printf("%d\n", m[index].in+1); } int main() { int k = 0; while(~scanf("%d%d", &m[k].w, &m[k].s)) { m[k].in = k; k++; } sort(m, m+k, cmp); for(int i=0; i<k; i++) { dp[i].pre = -1; dp[i].x = 1; } int ans = 0; int index; for(int i=0; i<k; i++) { for(int j=0; j<i; j++) { if(m[j].w<m[i].w && m[j].s>m[i].s) { if(dp[i].x<dp[j].x+1) { dp[i].x = dp[j].x + 1; dp[i].pre = j; } } } if(ans<dp[i].x) { ans = dp[i].x; index = i; } } printf("%d\n", ans); print(index); return 0; }
相关文章推荐
- iOS - 策略模式
- 书单(二)Head First HTML与CSS、XHTML(中文版).pdf
- view动画浅析
- 硬件免费,乐视正在试图变革消费模式
- 硬件免费,乐视正在试图变革消费模式
- java 上的各种路径获取
- WEB开发者必备的7个JavaScript函数
- Main函数中的argc和argv应用举例
- 设置Tomcat的UTF-8编码
- BZOJ 3262 陌上花开(CDQ分治)
- 彻底明白如何设置minSdkVersion和targetSdkVersion
- 42、Oracle 11g服务器安装详细步骤——图文教程
- VS应用程序无法启动0xc000007b
- Csdn 转载方法
- AD PCB制图问题解答
- android studio自定义属性使用
- 4.1.3.2 master_sigsetup函数:信号处理程序初始化
- android:layout_weight详细分析介绍
- android一些系统相关的东西
- 非阻塞SOCKET套接字connect等待时间的实现