动态规划(线性模型):POJ 2533 最长上升子序列

用一个数组dp[i]表示子串1——i(以seq[i]结尾)的最长上升子序列的长度。(注意必须包括seq[i],例如如果seq为:2 3 4 5 1,则dp[5]等于1,但是seq的最长上升子序列长度为4,即dp[4])则此时的状态转移方程dp[i] = max(dp[j]+1) (转移条件 1<j<i && seq[i] > seq[j])。复杂度为O(n^2)。#include <cstdio> #define MAX 1001 using namespace std; int cnt; int seq[MAX]; int dp[MAX]; int DP(int seq[], int n) { int i, j, ret = 1; dp[1] = 1; for (i=2; i<=n; i++) { int max = 0; for (j=1; j<i; j++) { if (seq[i] > seq[j]) { if (dp[j] > max) { max = dp[j]; } } } dp[i] = max + 1; if (dp[i] > ret) { ret = dp[i]; } } return ret; } int main(void) { scanf("%d", &cnt); int temp = 1; while (temp <= cnt) { scanf("%d", &(seq[temp++])); } printf("%d/n", DP(seq, cnt)); return 0; }

你可能感兴趣的:(动态规划(线性模型):POJ 2533 最长上升子序列)