HDU 1160 —— FatMouse’s Speed
给定 n 只老鼠,每只老鼠有体重和速度,求老鼠的一个最长序列,使得体重严格递增,速度严格递减。给出这个序列的长度,并且输出这个序列中的每只老鼠在输入中的序号。
解题思路:先对所有老鼠排序,第一个关键字体重从小到大,第二关键字速度从大到小。然后求这个序列中的最长严格递增子序列。
dp[i] 记录以 i 只老鼠作为结尾的最长合法序列的长度,则有状态转移方程 dp[i]=max{dp[j]+1},0<=j<i, 只老鼠前面。
最后输出时,用栈的方式输出。
以下为代码:
#include<iostream>
#include <algorithm>
#include <vector>
using namespace std;
struct zc
{
int w;
int s;
int n;
}m[1005];
int dp[1005];
bool comp(const zc &a,const zc&b)
{
if(a.w!=b.w)
return a.w<b.w;
return a.s>b.s;
}
int max(int a,int b)
{
if(a>b)
return a;
else
return b;
}
int main()
{
int i,j,k;
for(i=0;i<1005;i++)
dp[i]=1;
for(i=1;cin>>m[i].w>>m[i].s;i++)
m[i].n=i;
sort(m+1,m+i,comp);
int maxd=1;
for(j=2;j<i;j++)
for(k=1;k<j;k++)
if(m[k].w < m[j].w && m[k].s > m[j].s)
{
dp[j] = max(dp[k]+1, dp[j]);
if(dp[j] > dp[maxd])
maxd = j;
}
cout<<dp[maxd]<<endl;
int temp=maxd;
vector<int>mm;
mm.push_back(maxd);
for(j=maxd-1;j>=1;j--)
if(dp[maxd]==dp[j]+1)
{
mm.push_back(j);
maxd=j;
}
for(j=dp[temp]-1;j>=0;j--)
cout<<m[mm[j]].n<<endl;
}