题目链接:http://poj.org/problem?id=2533
思路分析:该问题为经典的最长递增子序列问题,使用动态规划就可以解决;
1)状态定义:假设序列为A[0, 1, .., n],则定义状态dp[i]为以在所有的递增子序列中以A[i]为递增子序列的最后一个数字的所有递增子序列中的最大长度;
如:根据题目,在所有的以3结尾的递增子序列有[3]和[1, 3],所以dp[2] =2;
2)状态转移方程:因为当A[j] < A[i]时(0<= j < i),dp[i] = Max(dp[i], dp[j] + 1);
3)求解:求出所有以A[i]为尾的递增子序列中最大长度,则只需要在求出dp[i]中的最大值即可求解;
代码如下:
#include <iostream> using namespace std; const int MAX_N = 1000 + 100; int num[MAX_N], dp[MAX_N]; int main() { int n; while (scanf("%d", &n) != EOF) { int ans = 0; for (int i = 0; i < n; ++i) scanf("%d", &num[i]); for (int i = 0; i < n; ++i) dp[i] = 1; for (int i = 0; i < n; ++i) { for (int j = 0; j < i; ++j) { if (num[j] < num[i]) dp[i] = dp[j] + 1 > dp[i] ? dp[j] + 1 : dp[i]; } } for (int i = 0; i < n; ++i) ans = dp[i] > ans ? dp[i] : ans; printf("%d\n", ans); } return 0; }
时间: 2024-10-20 19:34:51