zoukankan      html  css  js  c++  java
  • Dynamic Programming (II)

    1. The Longest Prefix

      This is my solution to USACO training problem "prefix":

     1 import java.io.*;
     2 import java.util.*;
     3 
     4 public class prefix {
     5     public static Scanner input;
     6     public static PrintWriter output;
     7     public static String [] dict;
     8     public static char [] obj;
     9     
    10     private static int solve(int num,int len)  {
    11         int [] dp = new int [len+1];
    12         // dp[i] will be the length of the longest prefix
    13         //        that starts from obj[i]
    14         for (int i=len-1;i>=0;i--) {
    15             for (int j=0;j<num;j++) {
    16                 if (!consult(i,j,len)) {
    17                     continue;
    18                 }
    19                 int d = dict[j].length();
    20                 if (d+dp[i+d]>dp[i]) {
    21                     dp[i] = dp[i+d]+d;
    22                 }
    23             }
    24         }
    25         return dp[0];
    26     }
    27     private static boolean consult(int pos,int j,int len)  {
    28         // Returns whether obj[pos] starts with dict[j]
    29         for (int i=0;i<dict[j].length();i++) {
    30             if (pos+i>=len||obj[pos+i]!=dict[j].charAt(i)) {
    31                 return false;
    32             }
    33         }
    34         return true;
    35     }
    36     public static void main(String[] args) throws IOException{
    37         dict = new String [256];
    38         obj = new char [200000];
    39         input = new Scanner(new FileReader("prefix.in"));
    40         int num = 0;
    41         do {
    42             dict[num++] = input.next();
    43         } while (!dict[num-1].equals("."));
    44         String line = null;
    45         int len = 0;
    46         while (input.hasNext()) {
    47             line = input.nextLine();
    48             for (int i=0;i<line.length();i++) {
    49                 obj[len++] = line.charAt(i);
    50             }
    51         }
    52         input.close();
    53         output = new PrintWriter(new FileWriter("prefix.out"));
    54         output.println(solve(num,len));
    55         output.close();
    56     }
    57 }

    2. Stringsobits

      This is my solution to USACO training problem "kimbits":

     1 import java.io.*;
     2 import java.util.*;
     3 
     4 public class kimbits {
     5     public static Scanner input;
     6     public static PrintWriter output;
     7     public static long [][] dp;
     8     
     9     private static void binSrch(int len,int num,long idx)  {
    10         // Generate the desired string from left to right by
    11         //        using a Divide-and-Conquer method
    12         if (len<=0) {
    13             output.println();
    14         } else if (idx<=dp[len-1][num]) {
    15             output.print(0);
    16             binSrch(len-1,num,idx);
    17         } else {
    18             output.print(1);
    19             binSrch(len-1,num-1,idx-dp[len-1][num]);
    20         }
    21     }
    22     public static void main(String[] args) throws IOException{
    23         // Obtain the input:
    24         input = new Scanner(new FileReader("kimbits.in"));
    25         int len = input.nextInt();
    26         int num = input.nextInt();
    27         long idx = input.nextLong();
    28         input.close();
    29         // Dynamic Programming:
    30         //        dp[i][j] will be the number of strings of length i,
    31         //                which have j or fewer 1s
    32         dp = new long [len+1][num+1];
    33         for (int j=0;j<=num;j++) {
    34             // please pay attention to this basis
    35             dp[0][j] = 1;
    36         }
    37         for (int i=1;i<=len;i++) {
    38             dp[i][0] = 1;
    39             for (int j=1;j<=num;j++) {
    40                 dp[i][j] = dp[i-1][j]+dp[i-1][j-1];
    41             }
    42         }
    43         // Phrase the output:
    44         output = new PrintWriter(new FileWriter("kimbits.out"));
    45         binSrch(len,num,idx);
    46         output.close();
    47     }
    48 }

    3. Contact

      This is my solution to USACO training problem "contact":

      1 import java.io.*;
      2 import java.util.*;
      3 
      4 public class contact {
      5     public static Scanner input;
      6     public static PrintWriter output;
      7     public static int [] info;
      8     public static int [] dp;
      9     
     10     private static class Subseq {
     11         public int code, freq;
     12         
     13         public Subseq(int code, int freq) {
     14             this.code = code;
     15             this.freq = freq;
     16         }
     17         public String toString() {
     18             return seqHelp(code);
     19         }
     20         private String seqHelp(int val) {
     21             // Decode the code of the 0-1 sequence
     22             if (val==0) {
     23                 return "";
     24             } else {
     25                 String str = String.valueOf(1-(val&1));
     26                 // turn to the parent node recursively
     27                 return seqHelp((val-1)>>1)+str;
     28             }
     29         }
     30     }
     31     
     32     private static void solve(int min,int max,int num,int len) {
     33         PriorityQueue<Subseq> q = new PriorityQueue<Subseq>(1<<13,
     34                 new Comparator<Subseq> () {
     35                     public int compare(Subseq s1,Subseq s2) {
     36                         // ATTENTION: there is an order on code when freq ties
     37                         if (s1.freq>s2.freq)  {
     38                             return -1;
     39                         } else if (s1.freq<s2.freq){
     40                             return 1;
     41                         } else if (s1.code<s2.code) {
     42                             return -1;
     43                         } else if (s1.code>s2.code) {
     44                             return 1;
     45                         } else {
     46                             return 0;
     47                         }
     48                     }
     49                 }
     50         );
     51         // Dynamic Programming:
     52         //        each sequence is coded into an integer, 
     53         //        which is an index of a complete binary tree
     54         dp = new int[1<<13];
     55         for (int i=0;i<len;i++) {
     56             int code = 0;
     57             for (int j=0;j<max&&i+j<len;j++) {
     58                 if (info[i+j]==0) {
     59                     code = (code<<1)+1;
     60                 } else {
     61                     code = (code<<1)+2;
     62                 }
     63                 dp[code]++;
     64             }
     65         }
     66         for (int i=(1<<min)-1;i<(1<<max<<1);i++) {
     67             if (dp[i]>0) {
     68                 // ATTENTION: do not enqueue a 0-1 sequence
     69                 //        unless its frequency is greater than 0
     70                 q.add(new Subseq(i,dp[i]));
     71             }
     72         }
     73         // This is the most frustrating part:
     74         //        phrase the output in the format required
     75         int tmp = 0;
     76         for (int i=0;i<num;i++) {
     77             if (q.isEmpty()) {
     78                 break;
     79             } else {
     80                 tmp = q.peek().freq;
     81                 output.println(tmp);
     82             }
     83             int mod = 0;
     84             while (!q.isEmpty()&&q.peek().freq==tmp) {
     85                 if (mod>0) {
     86                     output.print(" ");
     87                 }
     88                 output.print(q.poll());
     89                 if (mod==5) {
     90                     output.println();
     91                 }
     92                 mod = (mod+1)%6;
     93             }
     94             if (mod>0) {
     95                 output.println();
     96             }
     97         }
     98     }
     99     public static void main(String[] args) throws IOException {
    100         info = new int [200000];
    101         // Obtain the input:
    102         input = new Scanner(new FileReader("contact.in"));
    103         int min = input.nextInt();
    104         int max = input.nextInt();
    105         int num = input.nextInt();
    106         String line; 
    107         int len = 0;
    108         while (input.hasNext()) {
    109             line = input.nextLine();
    110             for (int i=0;i<line.length();i++) {
    111                 info[len++] = line.charAt(i)-'0';
    112             }
    113         }
    114         input.close();
    115        max = (max<len)? max:len;
    116        // Phrase the output:
    117        output = new PrintWriter(new FileWriter("contact.out"));
    118        solve(min,max,num,len);
    119        output.close();
    120     }
    121 }

     

  • 相关阅读:
    AX 2009 实现对display 方法过滤
    AX 2009实现数据验证方法
    AX 2009 实现outlook发送邮件并带多个附件
    AX 2009 销售订单导入导出
    Mixin技术与分布类编程
    关于python装饰器的总结
    作为软件工程师,你必须知道的20个常识
    Python装饰器基础语法总结
    如何成为一名黑客(转)
    python的对象和类
  • 原文地址:https://www.cnblogs.com/DevinZ/p/4411443.html
Copyright © 2011-2022 走看看