北京大学机试 最大上升子序列和 需要二刷 *最长不下降子序列的改良版

基本思想:

最长不下降子序列的改良版;

只需要更改状态转移方程即可,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;
	}
}

  

 

posted @ 2020-04-01 10:47  暮云林凌  阅读(119)  评论(0)    收藏  举报