TopCoder SRM 395 Level2 1000
http://www.topcoder.com/stat?c=problem_statement&pm=8463&rd=11129
标准的DP题目

在运算中几处忽略了比较检查,特殊值
导致错误了两次
做题目在主要思路有了之后还是要仔细考虑特殊情况
往往人家关注的地方就在这里
 1import java.util.*;
 2import java.util.regex.*;
 3import java.text.*;
 4import java.math.*;
 5import java.awt.geom.*;
 6
 7public class TriviaGame
 8{
 9    public int maximumScore(int[] points, int tokensNeeded, int[] bonuses)
10    {
11        int L = points.length;
12        int[][] dic = new int[L][tokensNeeded+1];
13        for(int[] i:dic)
14            Arrays.fill(i, -100000);
15        int i;
16        dic[0][0= -1 * points[0];
17        dic[0][1= points[0];
18        if(tokensNeeded == 1)
19            dic[0][0= dic[0][1]+bonuses[0];
20        for(i = 1; i < L; ++ i){
21            if(dic[i-1][0- points[i] > dic[i][0])
22                dic[i][0= dic[i-1][0- points[i];
23            int j;
24            for(j = 1; j < Math.min(i+2, tokensNeeded); ++ j){
25                int a = dic[i-1][j-1+ points[i];
26                int b = dic[i-1][j] - points[i];
27                dic[i][j] = Math.max(a, b);                
28            }

29            if(j == tokensNeeded){
30                dic[i][j] = dic[i-1][j-1+ points[i];
31                dic[i][j] += bonuses[i];
32                if(i != L - 1 && dic[i][j] > dic[i][0])
33                    dic[i][0= dic[i][j];
34            }

35                
36        }

37        int max = dic[L-1][0];
38        for(int in:dic[L-1])
39            if(in > max)
40                max = in;
41        return max;
42    }

43}