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

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


    網站導航:
     
    主站蜘蛛池模板: 精品国产日韩亚洲一区91| 亚洲欧美国产日韩av野草社区| 免费无码AV一区二区| 日韩免费高清视频网站| 亚洲色最新高清av网站| 免费无码又爽又刺激高潮| 亚洲精品乱码久久久久久V| 免费视频淫片aa毛片| 国产精品亚洲色图| 日韩精品成人亚洲专区| 一道本不卡免费视频| 亚洲综合国产一区二区三区| 中文字幕看片在线a免费| 久久久青草青青亚洲国产免观| 日本高清免费观看| 亚洲激情电影在线| 成人午夜性A级毛片免费| 国产精品亚洲综合网站| 亚洲色无码一区二区三区| 久9久9精品免费观看| 亚洲一级毛片免观看| 国产国产人免费视频成69大陆| 四虎影视永久在线精品免费| 亚洲人成网站在线观看播放| 亚洲免费网站在线观看| 亚洲另类无码专区首页| 久久久久亚洲精品无码网址| 蜜桃成人无码区免费视频网站 | 成全视频高清免费观看电视剧| 亚洲毛片在线观看| 成年18网站免费视频网站| 一级毛片免费在线| 亚洲麻豆精品果冻传媒| 精品国产免费观看久久久 | 777亚洲精品乱码久久久久久 | 日本免费高清一本视频| 一级有奶水毛片免费看| 亚洲区视频在线观看| 亚洲成a人片在线观看久| 8888四色奇米在线观看免费看| 亚洲色丰满少妇高潮18p|