zoukankan      html  css  js  c++  java
  • 第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
  • 相关阅读:
    有nativeQuery = true和没有的区别
    itext隐藏table的单元格边框
    Semaphore (参考资料,还没细看)
    STL 一级/二级空间配置器
    内联函数
    死锁
    用户态和内核态
    关于变量的可见性和生命周期
    主从库原理
    xx亿数据处理
  • 原文地址:https://www.cnblogs.com/yi-ye-zhi-qiu/p/8641959.html
Copyright © 2011-2022 走看看