原题目链接:HDU1160
分类
HDU 动态规划 最长上升子序列
题意
给出老鼠的体重和速度
求最长的序列,使得体重递增,速度递减
想法
最长上升子序列变形
还有他加上了一个并查集求最长上升子序列路径的东西
代码
/**
* Author: GatesMa
* Email: gatesma@foxmail.com
* Todo: ACM Training
* Date:2018/11/18
*/
#include <bits/stdc++.h>
using namespace std;
const int INF=0x3f3f3f3f;
const int maxn = 1111;
int dp[maxn];
int pre[maxn];
struct A{
int w,s,id;
}E[maxn];
bool cmp(A a,A b){
return a.w > b.w;
}
int main()
{
int k=0;
while(scanf("%d%d",&E[k].w,&E[k].s)!=-1){
E[k].id=k+1;
k++;
}
memset(pre,-1,sizeof(pre));
sort(E, E+k,cmp);
for(int i=0; i < k;i++)
dp[i] = 1;
for(int i=0;i<k;i++){
for(int j=0;j < i;j++)
{
if(E[i].w < E[j].w && E[i].s > E[j].s){
if(dp[i] < dp[j] + 1){
dp[i] = dp[j] + 1;
pre[i] = j;
}
}
}
}
int ans=0;
int p;
for(int i=0;i<k;i++)
{
if(dp[i]>ans)
{
ans=dp[i];
p=i;
}
}
printf("%d\n",dp[p]);
while(p!=-1)
{
printf("%d\n",E[p].id);
p=pre[p];
}
return 0;
}