首先该题思路是,首先根据提示,这是一组数据,用固定大小的数组存储他们的成绩,因为他们的成绩是有顺序,有相邻关系,所以可以用二维数 组,分别存储序号和成绩,对于计算总的奖金,可以先创建一个奖金数组存储每个小组的奖金,先初始化为 1W ,然后对该二维数组从前往后遍历:
看相邻队伍的成绩:
当 i 对应的分数比 i-1 的分数小时, i应该拿到更多的奖金,所以有a[i][2] = a[i - 1][2] + 1;
当 i 对应的分数跟 i+1 相等时,a[i][2] = a[i - 1][2];
当 i -1对应的分数比 i 大时:需要利益最大化,就要看是(i-1)前面累加的奖金多还是(i-1)后面小组的奖金多,因此是a[j - 1][2] = Math.max(a[j - 1][2], a[j][2] + 1);当i-1更新时,i-2的奖金也必须更新,一直到0,看是否成绩好与i-1,因此用for循环for (int j = i; j > 0; j--)
最后累加各组的奖金。
import java.util.Scanner;
public class reword {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner in = new Scanner(System.in);
while (in.hasNext()) {
int n = in.nextInt();
int a[][] = new int[n][3];
for (int i = 0; i < n; i++) {
a[i][0] = i;
a[i][1] = in.nextInt();
a[i][2] = 1;
}
int reword = 0;
for (int i = 1; i < n; i++) {
if (a[i][1] > a[i - 1][1]) {
a[i][2] = a[i - 1][2] + 1;
} else if (a[i][1] < a[i - 1][1]) {
for (int j = i; j > 0; j--) {
if (a[j - 1][1] > a[j][1]) {
a[j - 1][2] = Math.max(a[j - 1][2], a[j][2] + 1);
}
}
} else {
a[i][2] = a[i - 1][2];
}
}
for (int i = 0; i < n; i++) {
reword += a[i][2];
}
System.out.println(reword);
}
}
}