zoukankan      html  css  js  c++  java
  • ADV-299 宰羊 (java,过了30%)

    问题描述
      炫炫回了内蒙,肯定要吃羊肉啦,所有他家要宰羊吃。
      炫炫家有N只羊,羊圈排成一排,标号1~N。炫炫每天吃掉一只羊(这食量!其实是放生啦),吃掉的羊的邻居会以为它被放生了,然后又会告诉他们的邻居,这样一直传播下去,除非某个邻居已经被“放生”了。每一天,所有知道某羊被“放生”了这个消息的羊都会很不满,如果不给他们巧克力的话,他们就会很造反,炫炫已经知道他要吃掉哪些羊,他可以任意安排吃的顺序,然后使巧克力的用量最小,请求出这个最小值。
    输入格式
      本题有多组数据,第一行为数据组数T。
      对于每组数据
      第一行:两个用空格隔开的整数:N和M,表示羊的数量和需要吃掉的数量
      第二行:有M个数,表示要吃那些羊。
    输出格式
      T行,为每组数据的答案。
    样例输入
    2
    8 1
    3
    20 3
    3 6 14
    样例输出
    7
    35
     
     
     
    废了,本来想用状压DP,数据貌似有点大,用了区间DP,可惜只过30%,不知道有什么特例需要注意
    (仅记录)
     1 import java.util.*;
     2 
     3 public class Main {
     4     static Scanner sc = new Scanner(System.in);
     5     static int[] shuru() {
     6         int n = sc.nextInt();
     7         int m = sc.nextInt();
     8         int[] a = new int[m+1];
     9         a[0] = n;
    10         for(int i = 1; i <= m; ++i)
    11             a[i] = sc.nextInt();
    12         return a;
    13         
    14     }
    15     
    16     static void tiana(int a[]) {
    17         int n = a[0];
    18         int m = a.length-1;
    19         int[] eat = new int[m+2];
    20         for(int i = 1; i < a.length; ++i) 
    21             eat[i] = a[i];
    22         
    23         if(a.length-1 == 1) {
    24             System.out.println(n-1);
    25         }
    26         else {
    27         eat[0] = 0;
    28         eat[m+1] = n+1;
    29         
    30         int len = m + 2;
    31         int[] num = new int[len];
    32         int[] sum = new int[len];
    33         int[][] dp = new int[len+1][len+1];
    34         for(int i = 1; i < len; ++i) {
    35             num[i] = eat[i] - eat[i-1] - 1;
    36             sum[i] = sum[i-1] + num[i];
    37 //            System.out.println(num[i]);
    38         }
    39             
    40 
    41         for(int i = 1; i < len; ++i) {
    42             for(int j = 1; j + i < len; ++j) {
    43                 int r = i + j;
    44                 dp[j][r] = 10000;
    45                 for(int k = j; k <= r; ++k) {
    46                     dp[j][r] = Math.min(dp[j][r], dp[j][k] + dp[k+1][r]);
    47                 }
    48                     
    49                 dp[j][r] += sum[r] - sum[j-1] + i - 1;
    50             }
    51         }
    52         
    53         System.out.println(dp[1][len-1]);
    54         }
    55     }
    56     
    57     public static void main(String args[]) {
    58 
    59         int t = sc.nextInt();
    60         Queue<int[]> queue = new LinkedList<int[]>();
    61         for(int i = 0; i < t; ++i) {
    62             queue.add(shuru());
    63         }
    64 
    65         while(!queue.isEmpty()) 
    66             tiana(queue.poll());
    67         
    68     }
    69 }

    看看就好,如果有大佬有全部过的代码,麻烦给个链接,谢谢。

    还是太菜了。
     
  • 相关阅读:
    LeetCode --- Roman to Integer
    LeetCode --- Maximum Depth of Binary Tree
    LeetCode --- Minimum Path Sum
    Hashkell 第一篇
    LeetCode --- Partition List
    LeetCode --- Valid Palindrome
    LeetCode --- Longest Consecutive Sequence
    LeetCode --- Insertion Sort List
    数据库lib7第2, 3题(创建索引和触发器)
    LeetCode --- Reverse Integer
  • 原文地址:https://www.cnblogs.com/ohuo/p/12361663.html
Copyright © 2011-2022 走看看