import java.util.Scanner;
/**
***************************************************************************
** 简单的动态规划入门 **
***************************************************************************
*
*问题:求一串数字的最大上升子序列的和
*
*例如:序列1, 7, 3, 5, 9, 4, 8的上升子序列有1, 7、3, 5, 8、1, 3, 5, 9等。
* 这些上升子序列中序列和最大为18,为上升子序列1, 3, 5, 9的和。
* 对于给定的序列,求出上升子序列和的最大值。
*动态规划:
* 子问题:M(i) 表示以ai结尾的最大子序列递推公式:M(i) = ai + max {M(j)| aj<ai}
* 最后求出:max { M(i) }
*/
public class HDU1087 {
//result[i]保存以arr[i]结尾的最大子序列和
public static int[] result = new int[1000];
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int count = 0;
while((count=sc.nextInt()) != 0) {
//初始化数组
int arr[] = new int[count];
for(int i=0; i<count; i++) {
arr[i] = sc.nextInt();
}
//求最大上升子序列的和
int max = solve(arr);
System.out.println(max);
}
}
/**
* 求最大上升子序列的和
* @param arr
* @return
*/
public static int solve(int arr[]) {
int res = 0;//求result中对应的最大值
int max = 0;
int len = arr.length;
max = result[0] = arr[0];
//求arr[i]结尾的最大上升子序列的和,保存到result[i]中
for(int i=1; i<len; i++) {
max = 0;
for(int j=i-1; j>=0; j--) {
if(arr[i] > arr[j] && result[j] > max) {
max = result[j];
}
}
result[i] = arr[i] + max;
if(res < result[i]) {
res = result[i];
}
}
return res;
}
}
HDU1087
最新推荐文章于 2020-11-25 04:05:40 发布
