hdu 1160 dp

来源:互联网 发布:linux powershell 编辑:程序博客网 时间:2024/06/06 04:50

2014/9/28

 最长XX序列,卡在了怎么记录路径.....脑洞不够大。


//Ñô¹â´ÌÍ´Ë«íø#include<stdio.h>#include<string.h>#include<cmath> #include<algorithm>#include<iostream>#include<queue>#include<stack>#include<map>#include<climits>#include<vector>using namespace std;typedef long long ll;  #define f(x,y,i) for(int i = x;i < y; i++)#define ff(x,y,i) for(int i = x;i  <= y; i++)#define F(x,y,i) for(int i = x; i >= y; i--)#define FF(x,y,i) for(int i = x; i > y; i++)#define lson pos<<1,l,mid#define rson pos<<1|1,mid+1,r#define sc(n) scanf("%d",&n)#define pr(n) printf("%d\n",n)#define met(n,m) memset(n, m, sizeof(n)) #define mod 10007const int inf = INT_MAX;const int N=2050;int Max(int a,int b){return a>b?a:b;}int Min(int a,int b){return  a<b?a:b;}struct node{int v;int w;int temp;}ss[N];bool cmp(node a,node b){if(a.w != b.w)return a.w < b.w;else return a.v > b.v;}int vis[N]; int dp[N];int main(){int tot , n, m , sum , k , x ,y ,maxn;    tot = 0 ;maxn =0;k = 0;    while(~scanf("%d",&ss[tot].w))   {       scanf("%d",&ss[tot].v);       ss[tot].temp=tot+1;       tot++;   }   sort(ss,ss+tot,cmp);      //f(0,tot,i)printf("%d %d %d\n",ss[i].w,ss[i].v,ss[i].temp);     f(0,tot,i)dp[i]=1,vis[i]=i;      for(int i = 0;i< tot; i++)   {   for(int j = 0;j < i; j++)   {   if(ss[j].v > ss[i].v &&ss[i].w > ss[j].w)   {   if(dp[i] < dp[j]+1)   {   dp[i]=dp[j]+1;   vis[i] = j;   }      if(dp[i] > maxn)   {   maxn = dp[i];   k = i;   }      }   }   }    for( int i = 0;i < maxn; i++)  {  dp[i]=k;  k=vis[k];  }          printf("%d\n",maxn);  for(int i= maxn -1;i >= 0; i--)  {  printf("%d\n",ss[dp[i]].temp);  }          return 0;}


0 0
原创粉丝点击