LIS

来源:互联网 发布:js代码整理工具 编辑:程序博客网 时间:2024/05/01 14:47

LIS(最长上升子序列,poj2533)

子问题:dp[k] :a[k]为结尾的最长上升子序列  dp[k] = for(i = 0 : k-1)  dp[k] = max(dp[k], dp[i] + 1) ;

初始化 : for(i = 0 : n - 1) dp[i] = 1 ;


#include<iostream>#include<cstdio>#include<cstdlib>#include<algorithm>#include<cstring>#define FOR(i, x, y) for(int i = x; i <= y; i ++)#define FORD(i, y, x) for(int i = y; i >= x; i --)#define mset(x, v) memset(x, v, sizeof(x))#define maxn 1050using namespace std;int a[maxn], dp[maxn];int main(){    int n, maxlen;    while(scanf("%d", &n) != EOF){    mset(dp, 0);    FOR(i, 0, n - 1){        scanf("%d", &a[i]);        maxlen = 0;        FOR(j, 0, i - 1) if(a[i] > a[j]) maxlen = maxlen > dp[j] ? maxlen : dp[j];        dp[i] = maxlen + 1;    }    maxlen = dp[0];//    FOR(i, 0, n - 1) printf("%d ", dp[i]);    FOR(i, 0, n - 1) if(maxlen < dp[i]) maxlen = dp[i];    printf("%d\n", maxlen);    }    return 0;}


0 0
原创粉丝点击