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 }

     

  • 相关阅读:
    Rotation Kinematics
    离职 mark
    PnP 问题方程怎么列?
    DSO windowed optimization 代码 (4)
    Adjoint of SE(3)
    IMU 预积分推导
    DSO windowed optimization 代码 (3)
    DSO windowed optimization 代码 (2)
    OKVIS 代码框架
    DSO windowed optimization 代码 (1)
  • 原文地址:https://www.cnblogs.com/DevinZ/p/4411443.html
Copyright © 2011-2022 走看看