1. 程式人生 > >HDU 1160 FatMouse's Speed

HDU 1160 FatMouse's Speed

原題目連結:HDU1160


分類

HDU 動態規劃 最長上升子序列


題意

給出老鼠的體重和速度

求最長的序列,使得體重遞增,速度遞減


想法

最長上升子序列變形

還有他加上了一個並查集求最長上升子序列路徑的東西


程式碼

/**
 * Author: GatesMa
 * Email: [email protected]
 * 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; }