• 第15章15.1钢条切割


    /*每段长度的钢筋对应不同的盈利,问怎样切割能盈利最多!
    *
    *
    */



    //
    自顶向下 递归 #include<cstdio> #include<cstring> #include<algorithm> using namespace std ; #define maxn 1000000 int p[maxn] ; int solve(int n){ if (n==0){ return 0 ; } int max_num = -maxn ; for(int i=1 ; i<=n ; i++){ max_num = max(max_num , p[i]+solve(n - i )) ; } return max_num ; } int main(){ int n ; while(~scanf("%d" , &n)){ for(int i=1; i<=n ; i++){ scanf("%d" , &p[i]) ; } int result = solve(n) ; printf("%d " , result) ; } return 0 ; }

    带备忘的自顶向下递归

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std ; 
    
    #define maxn 1000000
    int p[maxn] ; 
    int visit[maxn] ; 
    
    
    int solve(int n){
        if(visit[n]>=0){
            return visit[n] ; 
        }
        if (n==0){
            return 0 ; 
        }
        int max_num = -maxn ; 
    
        for(int i=1 ; i<=n ; i++){
            max_num = max(max_num , p[i]+solve(n - i )) ; 
        }
        visit[n] = max_num ; 
        return max_num ; 
    }
    
    
    int main(){
         int n  ; 
         while(~scanf("%d" , &n)){
              
             for(int i=1;  i<=n ; i++){
                 scanf("%d" , &p[i]) ; 
             }
             //  盈利可能是 0 
             for(int i=0 ; i<=n ; i++){
                visit[i]  = -maxn ; 
             } 
    
             int result = solve(n) ; 
    
             printf("%d
    " , result) ; 
         }
        return 0 ; 
    }

    自底向上

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std ; 
    
    #define maxn 1000000
    int p[maxn] ; 
    int visit[maxn] ; 
    
    
    int solve(int n){
        visit[0] = 0 ; 
        for(int i=1 ; i<=n ; i++){
            int max_num = -maxn ; 
            for(int j=1 ; j<=i ; j++){
                max_num = max(max_num , p[j]+visit[i-j]) ; 
            }
            visit[i] = max_num ; 
        }
        return visit[n] ; 
    }
    
    
    int main(){
         int n  ; 
         while(~scanf("%d" , &n)){
             for(int i=1;  i<=n ; i++){
                 scanf("%d" , &p[i]) ; 
             }
             int result = solve(n) ; 
             printf("%d
    " , result) ; 
         }
        return 0 ; 
    }

     自底向上记录最优解对应的切割方案

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std ; 
    
    #define maxn 1000000
    int p[maxn] ; 
    int visit[maxn] ; 
    int cut[maxn] ; 
    
    int solve(int n){
        visit[0] = 0 ; 
        for(int i=1 ; i<=n ; i++){
            int max_num = -maxn ; 
            for(int j=1 ; j<=i ; j++){
                if(max_num < p[j]+visit[i-j]){
                    max_num = p[j]+visit[i-j] ; 
                    cut[i] = j ; 
                }
            }
            visit[i] = max_num ; 
        }
        return visit[n] ; 
    }
    
    
    int main(){
         int n  ; 
         while(~scanf("%d" , &n)){
             for(int i=1;  i<=n ; i++){
                 scanf("%d" , &p[i]) ; 
             }
             for(int i=0 ; i<=n ; i++){
                visit[i] = -maxn ; 
                cut[i] = 0 ; 
             }
             int result = solve(n) ; 
             while(n){
                printf("%d " , cut[n]) ; 
                n = n-cut[n] ; 
             }
             printf("%d
    " , result) ; 
         }
        return 0 ; 
    }
    View Code
  • 相关阅读:
    [论文笔记]CVPR2017_Joint Detection and Identification Feature Learning for Person Search
    [论文笔记]Objects as Points
    [论文笔记]ICCV2017_SVDNet for Pedestrian Retrieval
    [论文笔记]ICPR2016_Person Re-Identification Using CNN Features Learned from Combination of Attributes
    VMware ESXI6.0服务器安装系列:RAID设置
    LVM基础详细说明及动态扩容lvm逻辑卷的操作记录
    调用对象 “ha-datastoresystem”的“HostDatastoreSystem.QueryVmfsDatastoreCreateOptions” 失败。
    动态扩容lvm逻辑卷的操作记录
    Kubernetes之Flannel介绍
    Linux服务器同步网络时间
  • 原文地址:https://www.cnblogs.com/yi-ye-zhi-qiu/p/8641959.html
Copyright © 2020-2023  润新知