就是一个最长上升子序列而已。
状态转移的时候注意一下必须是严格递增的就好
#include<stdio.h>
#include<string.h>
#include<stack>
#include<vector>
#include<algorithm>
using namespace std;
struct P
{
int i;
int w;
int s;
P()
{
i=-1;
s=0;
}
P(int a,int b,int c)
{
i=a;w=b;s=c;
}
bool operator <(const P &o)const
{
return w<o.w;
}
};
P w[10002];
vector<P> ele;
int res[2000];
int dp[2000];
int main()
{
int tw,ts;
for(int i=0;i<2000;i++)
res[i]=i;
int index=1;
while(scanf("%d%d",&tw,&ts)!=EOF&&(tw!=0||ts!=0))
{
P tp(index++,tw,ts);
ele.push_back(tp);
}
sort(ele.begin(),ele.end());
memset(dp,0,sizeof(dp));
for(int i=0;i<ele.size();i++)
dp[i]=1;
int max_=-1;
int max_i=0;
for(int i=1;i<ele.size();i++)
{
for(int j=0;j<i;j++)
{
if(ele[i].s<ele[j].s&&ele[i].w!=ele[j].w&&dp[i]<dp[j]+1)
{
res[i]=j;
dp[i]=dp[j]+1;
}
}
}
for(int i=0;i<ele.size();i++)
{
if(max_==-1||max_<dp[i])
{
max_=dp[i];
max_i=i;
}
}
printf("%d\n",dp[max_i]);
stack<int> S;
while(res[max_i]!=max_i)
{
S.push(ele[max_i].i);
max_i=res[max_i];
}
S.push(ele[max_i].i);
while(!S.empty())
{
printf("%d\n",S.top());
S.pop();
}
}