动态规划 HDU-1087 Super Jumping! Jumping! Jumping!
题目链接: 杭电1087
题目大意: 给定一列数字 求最大顺序子列和 子列中的数字必须严格由小到大
解题思路: 将数组储存 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;
}