hdu 1160 FatMouse's Speed
来源:互联网 发布:mp4相册制作软件 编辑:程序博客网 时间:2024/06/08 20:15
题目大意就是求出两条件分别满足上升和下降的最长子序列。
解题思路:结构上套模板,细节上的区别有
1、想将一个条件排好序,相当于已经判别了一个条件;
2,、因为题目要求的是每个数在原序列的位置,所以需要在结构体中提前记录位置,以便于排序后仍能找到位置。另一点是在寻找最长子序列时,记录是由前面哪一个字符发展而来的,以便于能够知道各在排序后的位置。
#include <cstdio>#include<iostream>#include <cstring>#include<algorithm>using namespace std;const int maxn=1010;int dp[maxn],m,Max,b[maxn];struct mice{ int weight; int speed; int num;} a[maxn];bool cmp(mice a,mice b){ return a.weight<b.weight;}void out(int id){ if(b[id]!=id) out(b[id]); cout<<a[id].num<<endl;}void LICS(){ memset(dp,0,sizeof(dp)); for(int i=0; i<m; i++) { dp[i]=1; b[i]=i; for(int j=0; j<i; j++) if(a[i].speed<a[j].speed&&a[i].weight>a[j].weight && dp[i]<dp[j]+1) //条件多判断一个重量也不相等 { b[i]=j; dp[i]=dp[j]+1; //记录该位置最长的情况下,前一个字符的位置 } } Max=0; int id; for(int i=0; i<m; i++) if(Max<=dp[i]) //这里很坑,是<=,而不是< {Max=dp[i];id=i;} //寻找子序列长度和最后一个字符的位置 cout<<Max<<endl; out(id); //递归输出}int main(){ int i=0; while(scanf("%d%d",&a[i].weight,&a[i].speed)!=EOF) { i++; a[i-1].num=i; //记录该老鼠在原序列的位置 } m=i; sort(a,a+m,cmp); LICS(); return 0;}
1 0
- HDU 1160 FatMouse's Speed
- HDU 1160 - FatMouse's Speed
- hdu FatMouse's Speed 1160
- HDU-1160-FatMouse's Speed
- hdu 1160 FatMouse's Speed
- hdu 1160 FatMouse's Speed
- Hdu 1160 FatMouse's Speed
- hdu 1160 FatMouse's Speed
- hdu 1160 FatMouse's Speed
- HDU 1160 FatMouse's Speed
- HDU 1160 FatMouse's Speed
- hdu 1160 FatMouse's Speed
- HDU-1160 FatMouse's Speed
- hdu 1160 FatMouse's Speed
- hdu 1160 FatMouse's Speed
- hdu 1160 FatMouse's Speed
- hdu 1160 - FatMouse's Speed
- hdu 1160 FatMouse's Speed
- 码农小汪-Spring MVC -生产者、消费者限定 Content-Type Accept
- 选择器
- C/C++网络编程总结与ZeroMQ
- uva 1099 状态压缩(dp专组E)
- DOM
- hdu 1160 FatMouse's Speed
- POJ 1129 Channel Allocation(图的着色问题)
- 选择器
- 开源Math.NET基础数学类库使用(06)直接求解线性方程组
- 核心板产品
- 事件
- UIKit Dynamics动力系统入门
- 设置<a>元素的背景图像
- 动画