1. 程式人生 > >HDU 1160 FatMouse's Speed (最長上升子序列)

HDU 1160 FatMouse's Speed (最長上升子序列)

tar 1-1000 題解 sin pid pac blank scan target

題目鏈接

題意:n個老鼠有各自的重量和速度,要求輸出最長的重量依次嚴格遞增,速度依次嚴格遞減的序列,n最多1000,重量速度1-10000。

題解:按照重量遞增排序,找出最長的速度下降子序列,記錄序列每個位置的左邊的位置,找到最大值終點再遞歸輸出即可。(好久沒做題了,花了很多時間才AC。)

#include <bits/stdc++.h>
using namespace std;
struct sa
{
    int weight,speed,pos,l;
} data[1005];
bool cmp(sa x,sa y)
{
    if(x.weight==y.weight) return x.speed>y.speed;
    
return x.weight<y.weight; } int dp[1005]; void pr(int n) { if(data[n].l) pr(data[n].l); printf("%d\n",data[n].pos); } int main() { memset(data,0,sizeof(data)); int n=1,ans=0; while(scanf("%d%d",&data[n].weight,&data[n].speed)!=EOF) { data[n].pos=n; data[n].l
=0; n++; } sort(data+1,data+n+1,cmp); data[0].speed=99999999; memset(dp,0,sizeof(dp)); for(int i=1; i<n; i++) { for(int j=0; j<i; j++) { if(data[j].weight<data[i].weight&&data[j].speed>data[i].speed&&dp[j]+1>dp[i]) { dp[i]
=dp[j]+1; data[i].l=j; } if(dp[i]>dp[ans]) ans=i; } } //for(int i=0;i<=n;i++) // printf("%d %d *\n",i,dp[i]); printf("%d\n",dp[ans]); pr(ans); return 0; }

傳送門:https://www.cnblogs.com/cenariusxz/p/4290837.html

HDU 1160 FatMouse's Speed (最長上升子序列)