例:-5, -10, 20, -5, 10, 0 ,-5, 50 ,-10
最长不下降子序列:-5,-5,10,50 = 4(不只一个)
递推思路:使用数组dp存放以a[i]结尾的最长不下降子序列的长度
先令dp数组全为1
dp[0]=1
dp[1]=1 (因为dp[1]
dp[2]= dp[0]+1或dp[1]+1 (if(a[2]>=a[0]&&dp[2]
........
代码如下:
#include
#include
#include
using namespace std;
int dp[100];
int SubSequence(vector a) {
int max = -1;
dp[0] = 1;//以第一个元素结尾子序列为一
for (int i = 1; i < a.size(); i++) {
dp[i] = 1;//以该元素为结尾生成一个子序列
for (int j = 0; j < i; j++) {//从前遍历,判断a[i]元素是否满足子序列的要求
if (a[i] >= a[j] && dp[i] < dp[j] + 1) {
dp[i] = dp[j] + 1;
}
}
if (max < dp[i])max = dp[i];//求dp数组的最大值
}
return max;
}
int main() {
vector a = { -5, -10, 20, -5, 10, 0 ,-5, 50 ,-10 };
printf("%d\n", SubSequence(a));
for (int i = 0; i < a.size(); i++) {
printf("%d ", dp[i]);
}
}