这题状态转移方程很容易找dp[ i ]=max( dp[ i ] , dp[ j ]+1 ) 0<=j<i, 但是为什么我要把它放到我的博客呢,因为题目还要求我们记录路径,这是我第一次做记录路径的DP,一开始搞晕了,wa了好多次 。
代码如下:
#include<iostream>
#include<algorithm>
#include<string>
#include<stack>
#include<queue>
#include<map>
#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
#include<time.h>
#include<math.h>
#define N 10005
#define eps 1e-9
#define P system("pause")
using namespace std;
struct node {
int weight,speed;
int id;
friend bool operator<(node a,node b)
{
if(a.weight != b.weight) return a.weight<b.weight;
return a.speed>b.speed;
}
}s[N];
int dp[N];
int path[N];
int main()
{
//freopen("input.txt","r",stdin);
//freopen("output.txt","w",stdout);cc
int i,j,maxx,flag;
i=0;
while(scanf("%d%d",&s[i].weight,&s[i].speed)!=EOF){
i++;
s[i].id=i;
}
sort(s,s+i);
int n=i;
maxx=0;
memset(dp,0,sizeof(dp));
for(i=0;i<n;i++)
path[i]=i; //用于记录路径
for(i=0;i<n;i++)
{
for(j=0;j<i;j++)
{
if(s[i].weight>s[j].weight && s[i].speed<s[j].speed )
if(dp[j]>dp[i]){
dp[i]=dp[j];
path[ s[i].id ]=s[j].id; // s[i].id的祖先是s[j].id
}
}
dp[i]+=1;
if(dp[i]>maxx){
maxx=dp[i];
flag=s[i].id;
}
}
printf("%d\n",maxx);
stack<int> q;
while(path[flag]!=flag)
{
q.push(flag);
flag=path[flag];
}
q.push(flag);
while(!q.empty()){
printf("%d\n",q.top());
q.pop();
}
// P;
return 0;
}