原题:Problem 1003
嘛。。。自己菜的抠脚,能找到的测试数据几乎都过了,然而还是过不了OJ,要是有人有发现错误的话,欢迎指出。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int m = 0;
int cnt = 0;
while (n-- > 0) {
int maxNum = -1001;
int left = 0, right = 0;
cnt++;
int sum = 0;
m = sc.nextInt();
int[] arr = new int[100001];
for (int i=0; i<m; i++) {
arr[i] = sc.nextInt();
if (arr[i] > maxNum) {
maxNum = arr[i];
left = i + 1;
right = i + 1;
}
}
if (maxNum < 0) {
System.out.println("Case "+cnt+":");
System.out.println(maxNum + " " + left + " " + right);
if (n > 0) {
System.out.println();
}
}else{
maxNum = -1000;
left = 0;
right = 0;
int[][] dp = new int[2][100];
dp = dp(arr, m-1, sum);
for (int i=0; i<m; i++) {
if (dp[0][i] > maxNum) {
maxNum = dp[0][i];
right = i;
}
}
for (int i=right; i>0; i--) {
if (dp[1][i] == 0) {
left = i + 1;
break;
}
}
left += 1;
right += 1;
System.out.println("Case "+cnt+":");
System.out.println(maxNum + " " + left + " " + right);
if (n > 0) {
System.out.println();
}
}
}
}
public static int[][] dp(int[] arr, int idx, int sum) {
int[][] dp = new int[2][idx+1];
if (arr[0] < 0) {
dp[0][0] = 0;
dp[1][0] = 0;
}else{
dp[0][0] = arr[0];
dp[1][0] = 1;
}
for (int i=1; i<idx+1; i++) {
dp[0][i] = Math.max(dp[0][i-1]+arr[i], 0);
if (dp[0][i] >= 0 && dp[0][i-1]+arr[i] >= 0) {
dp[1][i] = 1;
}else{
dp[1][i] = 0;
}
}
return dp;
}
}
感觉错的不是dp,而是找左右坐标。