您的位置:首页 > 其它

hdu1087最长(最大)上升子序列

2017-01-20 03:05 225 查看
/*这个题的一个重要条件是下面的两个for循环,i<j && num[i] < num [j]时,有个相加关系*/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define INF 0x3f3f3f3f

using namespace std;

int n;
int num[1010];//原始数组
int dp[1010];//记忆数组dp

int main()
{
while(scanf("%d", &n) != EOF && n){
memset(num, 0, sizeof(num));
memset(dp, 0, sizeof(dp));
int sum ;
for(int i = 0; i < n; i++) scanf("%d", &num[i]);
dp[0] = num[0];
int maxx = dp[0];//先默认第一个数为最大
for(int i = 1; i < n; i++){
sum = num[i];//这里是因为上一个点不一定符合j<i && num[i] > num[j]则没有sum 所以sum最小为当前num[i]
for(int j = 0; j < n; j++){
if(num[i] > num[j]) sum = max(sum, num[i]+dp[j]);

}
dp[i] = sum;//这里更新每次每个符合条件的当前点的最大值并记忆化避免多次运算
maxx = max(maxx, dp[i]);//这里是找出最大的dp
}
cout << maxx << endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: