阿里测评——靶子
问答题:
在某射击场有N个靶,每个靶上都有一个分数,存在score数组中。击中第i个靶的得分为score[left] * score[i] * score[right],同时原left和right两个靶变为相邻的靶。其中得分为0的靶是不能射击的,当left不存在或者不能射击时,得分为 score[i] * score[right],同理right也遵循此规则; 当left和right都不存在或者不能射击时,得分为score[i]。请计算出击中所有能射击的靶,最多能得多少分?设计算法。
可参考:leetCode312.Burst Balloons
AC通过,不足之处请指正
1 import java.util.ArrayList; 2 import java.util.List; 3 import java.util.Scanner; 4 5 public class Main{ 6 7 public static void main(String[] args) { 8 Scanner sc=new Scanner(System.in); 9 List<Integer>list=new ArrayList<Integer>(); 10 List<Integer>tmplist=new ArrayList<Integer>(); 11 int sum=0; 12 int n=sc.nextInt(); 13 for(int i=0;i<n;i++) 14 list.add(sc.nextInt()); 15 for(int i=0;i<n;i++){ 16 if(list.get(i)!=0) 17 tmplist.add(list.get(i)); 18 else{ 19 int []a=new int[tmplist.size()]; 20 for(int j=0;j<tmplist.size();j++){ 21 a[j]=tmplist.get(j); 22 } 23 sum+=maxCoins(a); 24 tmplist.clear(); 25 } 26 if(i==n-1){ 27 int []a=new int[tmplist.size()]; 28 for(int j=0;j<tmplist.size();j++){ 29 a[j]=tmplist.get(j); 30 } 31 sum+=maxCoins(a); 32 tmplist.clear(); 33 } 34 } 35 System.out.println(sum); 36 } 37 public static int maxCoins(int[] iNums) { 38 int[] nums = new int[iNums.length + 2]; 39 int n = 1; 40 for (int x : iNums) if (x > 0) nums[n++] = x; 41 nums[0] = nums[n++] = 1; 42 int[][] memo = new int[n][n]; 43 return burst(memo, nums, 0, n - 1); 44 } 45 46 public static int burst(int[][] memo, int[] nums, int left, int right) { 47 if (left + 1 == right) return 0; 48 if (memo[left][right] > 0) return memo[left][right]; 49 int ans = 0; 50 for (int i = left + 1; i < right; ++i) 51 ans = Math.max(ans, nums[left] * nums[i] * nums[right] 52 + burst(memo, nums, left, i) + burst(memo, nums, i, right)); 53 memo[left][right] = ans; 54 return ans; 55 } 56 57 }