北京大学机试 最大上升子序列和 需要二刷 *最长不下降子序列的改良版
基本思想:
最长不下降子序列的改良版;
只需要更改状态转移方程即可,dp数组内存储的是最大子序列和;
dp[i] = max(dp[i], dp[j] + num[j])
状态转移方程如上所示,且j的取值范围为0~i-1;
关键点:
无;
#include<iostream>
#include<stdio.h>
#include<vector>
#include<string>
#include<algorithm>
using namespace std;
const int maxn = 1100;
int n;
int d[maxn];
int dp[maxn];
int main() {
while (cin >> n) {
fill(d, d + maxn, 0);
fill(dp, dp + maxn, 0);
for (int i = 0; i < n; i++) {
cin >> d[i];
}
dp[0] = d[0];
for (int i = 1; i < n; i++) {
int index = 0;
dp[i] = d[i];
for (int j = 0; j < n; j++) {
if (d[i] > d[j]) {
if (dp[j] + d[i] > dp[i]) {
dp[i] = dp[j] + d[i];
}
}
}
}
sort(dp, dp + n);
cout << dp[n - 1] << endl;
}
}

浙公网安备 33010602011771号