hdu 1087 dp

//考察点dp
//思路:这里我使用dp数组,dp[i]表示到i位置之前的最大值(包括i),最后我们只需要重新遍历一下数组dp获得最大值,即为所求结果。
//提交情况:使用g++提交compiler Error,使用c++提交AC
//注:这道题都是正整数的情况,没有负数情况
//AC code
#include<iostream>
using namespace std;
//表示该位置之前(包括该位置)的最大和
int dp[1005];
int a[1005];

int main(){
	int n;
	while(scanf("%d",&n)&&n){
		int i,j;
		for(i=1;i<=n;i++){
			scanf("%d",&a[i]);
		}
		a[0]=0;
		int max=-9999999999;
		memset(dp,0,sizeof(dp));
		for(i=1;i<=n;i++){
			max=-9999999999;
			for(j=0;j<i;j++){
				if(a[i]>a[j]&&dp[j]+a[i]>max){
					max=dp[j]+a[i];
				}
			}
			dp[i]=max;
		}
		max=-9999999999;
		for(i=1;i<=n;i++){
			if(dp[i]>max)
				max=dp[i];
		}
		cout<<max<<endl;
	}
	return 0;
}

你可能感兴趣的:(C++,compiler)