<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    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 閱讀(2019) 評論(0)  編輯  收藏

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


    網站導航:
     
    主站蜘蛛池模板: 精选影视免费在线 | 美女被爆羞羞网站免费| 黄色片免费在线观看| 伊伊人成亚洲综合人网7777| 日本视频免费观看| 亚洲AV无码一区二三区| 特级毛片在线大全免费播放| 啊v在线免费观看| 免费国产草莓视频在线观看黄| 亚洲高清成人一区二区三区| 一级A毛片免费观看久久精品| 免费人成视频在线观看不卡| 午夜不卡AV免费| 亚洲中文字幕在线观看| 最近免费中文字幕MV在线视频3| 亚洲精品~无码抽插| 久久久精品免费国产四虎| 久久精品国产亚洲AV无码麻豆| 香港a毛片免费观看 | 日本无卡码免费一区二区三区| 亚洲真人无码永久在线观看| 国产在线播放免费| 精品无码一级毛片免费视频观看| 亚洲精品无码久久一线| 24小时免费看片| 大桥未久亚洲无av码在线| 精品亚洲视频在线观看| 久久国产精品2020免费m3u8 | 久久被窝电影亚洲爽爽爽| 亚洲乱码精品久久久久..| 精品一卡2卡三卡4卡免费视频| 亚洲精品网站在线观看你懂的| 全免费a级毛片免费看不卡| 国产精品高清免费网站 | 亚洲老熟女五十路老熟女bbw| 亚洲精品国产精品乱码不卡| 99在线观看免费视频| 亚洲综合一区二区三区四区五区| 亚洲日本韩国在线| 最近新韩国日本免费观看 | 亚洲日韩久久综合中文字幕|