近几天刚开始接触dp。
队友推荐的第一道题(最长上升子序列) 就是要严格按照递增顺序走的 。
先排好序,然后就跟矩阵嵌套一样。
其实有个二分的,只不过貌似不能用在这道题上,因为要输出路径的。
代码如下:
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
const int M=1002;
struct node
{
int wei;
int iq;
int id;
} p[M];
int path[M];
int dp[M];
int MAX=-1;
int k=-1;
int cmp(node a,node b)
{
if(a.wei!=b.wei)
return a.wei<b.wei;
if(a.iq!=b.iq)
return a.iq>b.iq;
}
int n;
//int lis()
//{
// b[0]=p[0].id;
// int cur=1;
// for(int i=0; i<n; i++)
// {
// int j=lower_bound(b,b+cur,p[i].id)-b;
// b[j]=p[i].id;
// if(j>=cur)
// cur++;
// }
// return cur;
//}
void print(int i)
{
if(MAX--)
{
print(path[i]);
printf("%d\n",p[i].id);
}
}
int main()
{
//freopen("in.txt","r",stdin);
n=0;
while(~scanf("%d%d",&p[n].wei,&p[n].iq))
{
p[n++].id=n;
}
sort(p+1,p+n+1,cmp);
for(int i=1;i<n;i++)
{
path[i]=1;
dp[i]=1;
}
for(int i=1; i<n; i++)
for(int j=1; j<i; j++)
{
if(p[i].wei>p[j].wei&&p[i].iq<p[j].iq&&dp[i]<dp[j]+1)
{
dp[i]=dp[j]+1;
path[i]=j;
}
if(dp[i]>MAX)
MAX=dp[i],k=i;
}
printf("%d\n",MAX);
print(k);
return 0;
}