E81086713E446D36F62B2AA2A3502B5EB155

          Java雜家

          雜七雜八。。。一家之言

          BlogJava 首頁 新隨筆 聯系 聚合 管理
            40 Posts :: 1 Stories :: 174 Comments :: 0 Trackbacks
          年過的差不多了,今天偶爾興起上HOJ上翻幾道DP練手的題來。。。,順便把代碼貼下留念 
          1.數塔
          /**
           * 
           
          */
          package hduacm;

          import java.util.Scanner;

          /**
           * 
          http://acm.hdu.edu.cn/diy/contest_showproblem.php?pid=1001&cid=9066&hide=0
           * 
           * 
          @author yovn
           * 
           
          */
          public class P1001 {

              
          /**
               * 
               * 
          @param args
               
          */
              
          public static void main(String[] args) {
                  Scanner cin 
          = new Scanner(System.in);
                  
          int nline = cin.nextInt();
                  
          for (int i = 0; i < nline; i++) {
                      
          int nn = cin.nextInt();
                      
          int tn = (nn * (nn + 1)) / 2;
                      
          int arr[] = new int[tn];
                      
          int delta = 0;
                      
          for (int k = 0; k < nn; k++) {
                          
          for (int j = 0; j <= k; j++) {
                              arr[delta 
          + j] = cin.nextInt();
                          }

                          delta 
          += k + 1;
                      }
                      
          int max = solve(arr, tn, nn);
                      System.out.println(max);

                  }

              }

              
          private static int solve(int[] arr, int tn, int nn) {
                  
          int delta = 0;
                  
          int max[] = new int[tn];
                  max[
          0= arr[0];
                  
          int maxt = max[0];
                  delta 
          = 1;
                  
          for (int k = 1; k < nn; k++) {
                      
          // 計算第(k+1)行
                      for (int j = 0; j <= k; j++) {
                          
          if (j == 0) {
                              max[delta 
          + j] = max[delta - k] + arr[delta + j];
                          } 
          else if (j == k) {
                              max[delta 
          + j] = max[delta - 1+ arr[delta + j];
                          } 
          else {
                              
          if (max[delta - k + j] > max[delta - k + j - 1]) {
                                  max[delta 
          + j] = max[delta - k + j] + arr[delta + j];
                              } 
          else {
                                  max[delta 
          + j] = max[delta - k + j - 1]
                                          
          + arr[delta + j];
                              }
                          }
                          
          if (k == nn - 1 && max[delta + j] > maxt) {
                              maxt 
          = max[delta + j];
                          }
                      }
                      delta 
          += k + 1;
                  }
                  
          return maxt;

              }
          }
          2.Super Jumping!Jumping!Jumping!
          簡單的DP題
          /**
           * 
           
          */
          package hduacm;

          import java.util.Scanner;

          /**
           * 
          http://acm.hdu.edu.cn/diy/contest_showproblem.php?pid=1002&cid=9066&hide=0
           * 
          @author yovn
           *
           
          */
          public class P1002 {

              
          /**
               * 
          @param args
               
          */
              
          public static void main(String[] args) {
                  Scanner cin 
          = new Scanner(System.in);
                  
          int nn=cin.nextInt();
                  
          while(nn>0){
                       
          int arr[]=new int[nn];
                       
          for(int i=0;i<nn;i++){
                           arr[i]
          =cin.nextInt();
                       }
                       
          int max=solve(arr,nn);
                       System.out.println(max);
                       nn
          =cin.nextInt();
                  }

              }

              
          private static int solve(int[] arr, int nn) {
                  
          int max[]=new int[nn];
                  System.arraycopy(arr, 
          0, max, 0, nn);
                  
          int maxt=max[0];
                  
          for(int j=1;j<nn;j++){
                      
          for(int k=j-1;k>=0;k--){
                          
          if(arr[j]>arr[k]){
                              
          if(arr[j]+max[k]>max[j]){
                                  max[j]
          =arr[j]+max[k];
                              }
                          }
                      }
                      
          if(max[j]>maxt){
                          maxt
          =max[j];
                      }
                  }
                  
          return maxt;
              }

          }
          3.免費餡餅
           這道題跟數塔其實很像的,可以看作是它的變型。題目說明數據量可能很大,怕超時,故用C++實現之。
          #include <cstdio>
          #include 
          <cstdlib>
          #include 
          <memory.h>
          int infos[100000][11]={{0}};
          int main(void) {
              
          int tn;
              
          int maxt = 0;
              
          int a, b;
              
          while (scanf("%d"&tn) != EOF) {
                  
          if (tn == 0)
                      
          break;
                  memset(
          &infos[0][0], 0sizeof(infos));
                  
          for (int i = 0; i < tn; i++) {
                      scanf(
          "%d%d"&a, &b);
                      
          if (b > maxt) {
                          maxt 
          = b;
                      }
                      infos[b][a] 
          += 1;

                  }
                  
          int** max = new int*[maxt + 1];
                  
          for (int i = 0; i <= maxt; i++) {
                      max[i] 
          = new int[11];
                      memset(max[i], 
          0sizeof(int* 11);
                  }
                  
          int maxnn = 0;
                  
          for (int i = 1; i <= maxt; i++) {
                      
          for (int j = 0; j <= 10; j++) {
                          
          if(i==1 && (j<4 || j>6))continue;//從5開始
                          if (j == 0) {
                              
          if (max[i - 1][j] > max[i - 1][j + 1]) {
                                  max[i][j] 
          = max[i - 1][j] + infos[i][j];
                              } 
          else {
                                  max[i][j] 
          = max[i - 1][j + 1+ infos[i][j];
                              }
                          } 
          else if (j == 10) {
                              
          if (max[i - 1][j] > max[i - 1][j - 1]) {
                                  max[i][j] 
          = max[i - 1][j] + infos[i][j];
                              } 
          else {
                                  max[i][j] 
          = max[i - 1][j - 1+ infos[i][j];
                              }
                          } 
          else {
                              
          if (max[i - 1][j] > max[i - 1][j - 1]) {
                                  
          if (max[i - 1][j] > max[i - 1][j + 1]) {
                                      max[i][j] 
          = max[i - 1][j] + infos[i][j];
                                  } 
          else {
                                      max[i][j] 
          = max[i - 1][j + 1+ infos[i][j];
                                  }
                              } 
          else {
                                  
          if (max[i - 1][j - 1> max[i - 1][j + 1]) {
                                      max[i][j] 
          = max[i - 1][j - 1+ infos[i][j];
                                  } 
          else {
                                      max[i][j] 
          = max[i - 1][j + 1+ infos[i][j];
                                  }
                              }
                          }
                          
          if (i == maxt && max[i][j] > maxnn) {
                              maxnn 
          = max[i][j];
                          }
                      }
                  }
                  
          for (int i = 0; i <= maxt; i++) {
                      delete[] max[i];
                      max[i] 
          = NULL;
                  }
                  delete[] max;
                  printf(
          "%d\n", maxnn);

              }
              
          return 0;
          }
          posted on 2011-02-06 21:13 DoubleH 閱讀(2022) 評論(0)  編輯  收藏

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 望谟县| 密山市| 威信县| 利辛县| 修水县| 安多县| 岑溪市| 图木舒克市| 贵阳市| 安义县| 武威市| 遂平县| 恩平市| 扎赉特旗| 太白县| 土默特右旗| 克山县| 恩施市| 泌阳县| 郎溪县| 平阳县| 舟山市| 方正县| 农安县| 交城县| 肇源县| 伊通| 田阳县| 罗江县| 海城市| 南郑县| 新乡县| 深水埗区| 洛南县| 商城县| 迭部县| 右玉县| 莒南县| 内江市| 宽城| 镶黄旗|