动态规划 HDU-1087 Super Jumping! Jumping! Jumping!

题目链接: 杭电1087
HDU-1087 Super Jumping! Jumping! Jumping!
题目大意: 给定一列数字 求最大顺序子列和 子列中的数字必须严格由小到大

解题思路: 将数组储存 dp[i]储存以arr[i]为结尾的最大值 循环当前判断的前面的数字 如果当前的数字比之前的数字大 则进行dp的替换 方程为:dp[i] = max(dp[i], dp[j] + arr[i]);将前面的数字全部遍历一遍 则得到最优解,最后将dp数组排序 取到最大值则为答案。

代码块:

#include<iostream>
#include<algorithm>
#include<cstring>

using namespace std;

int main() {
	int n;
	int arr[1009] = { 0 };
	int dp[1009] = { 0 };
	while (cin >> n) {
		if (n == 0) {
			return 0;
		}
		for (int i = 0; i < n; i++) {
			cin >> arr[i];
		}
		dp[0] = arr[0];
		for (int i = 1; i < n; i++) {
			dp[i] = arr[i];
			for (int j = 0; j < i; j++) {
				if (arr[i] > arr[j]) {
					dp[i] = max(dp[i], dp[j] + arr[i]);
				}
			}
		}
		sort(dp, dp + n);
		cout << dp[n - 1] << endl;
		memset(arr, 0, sizeof(arr));
		memset(dp, 0, sizeof(dp));
	}
	return 0;
}

相关文章: