普及练习场 线性动态规划 石子合并
2018-01-15 00:58
351 查看
题目链接
题意理解
首先这道题目不能用这样的贪心来做:对于环中的和最小的两个石子堆,先合并。因为这样做可能会导致在有的时候,不止一个和最小的两个石子堆,你在这里合并了之后,会影响后继的合并状态。这与之前可以用贪心写的不一样,是因为之前是可以任意合并两堆石子,而这里是环形中可以合并相邻的两堆石子。然后需要注意一下断环成链的技巧。注意点大部分都写到注释里面了。代码
import java.io.BufferedReader; import java.io.InputStreamReader; import java.util.StringTokenizer; public class Main { static int N; static final int maxn = 220; static int[] a = new int[maxn]; static int[] sum = new int[maxn]; static int[][] dp1 = new int[maxn][maxn]; static int[][] dp2 = new int[maxn][maxn]; public static void main(String[] args) { FastScanner fs = new FastScanner(); N = fs.nextInt(); for(int i = 1; i <= N; i++) { a[i] = fs.nextInt(); a[i+N] = a[i]; sum[i] = sum[i-1] + a[i]; } for(int i = N + 1; i <= 2 * N; i++) { sum[i] = sum[i-1] + a[i]; } // dp[l][r] = min{dp[l][k] + dp[k+1][r] + sum(l, r)} // 此时正确的枚举方式应该是:先枚举一遍r-l=1的,再枚举一遍r-l=2的,…… for(int len = 1; len <= N; len++) { for(int l = 1; l <= 2 * N; l++) { int r = l + len; if(r > N * 2) { break; } int min = 0x3f3f3f3f; int max = -1; for(int k = l; k < r; k++) { min = Math.min(min, dp1[l][k] + dp1[k+1][r] + sum(l, r)); max = Math.max(max, dp2[l][k] + dp2[k+1][r] + sum(l, r)); } dp1[l][r] = min; dp2[l][r] = max; } } int minScore = 0x3f3f3f3f; int maxScore = -1; for(int i = 1; i <= N; i++) { minScore = Math.min(minScore, dp1[i][i+N-1]); maxScore = Math.max(maxScore, dp2[i][i+N-1]); } System.out.println(minScore); System.out.println(maxScore); } public static int sum(int l, int r) { return sum[r] - sum[l-1]; } public static class FastScanner { private BufferedReader br; private StringTokenizer st; public FastScanner() { br = new BufferedReader(new InputStreamReader(System.in)); } public String nextToken() { while(st == null || !st.hasMoreElements()) { try { st = new StringTokenizer(br.readLine()); } catch (Exception e) { // TODO: handle exception } } return st.nextToken(); } public int nextInt() { return Integer.valueOf(nextToken()); } } }
相关文章推荐
- 普及练习场 线性动态规划 导弹拦截
- 普及练习场 线性动态规划 合唱队形
- 普及练习场 线性动态规划 尼克的任务
- 动态规划解石子合并问题
- 动态规划思想:石子合并问题
- 普及练习场 多维动态规划 Likecloud-吃、吃、吃
- 动态规划石子合并问题
- POJ 1179 Polygon(动态规划:类似环形石子合并)
- 转贴:动态规划之石子合并
- 动态规划之石子合并
- 动态规划之石子合并
- 动态规划解循环石子堆合并问题
- 动态规划之石子合并
- 动态规划:圆形石子合并问题
- 动态规划思想:石子合并问题
- 动态规划之石子合并(2)
- 石子合并的动态规划问题
- 石子合并;圈型;动态规划;重点在于处理圈型问题;代码内有算法解释;
- 石子合并的动态规划解决方案
- 动态规划-合并石子