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
  • 相关阅读:
    Silverlight 2学习笔记一:初识Silverlight
    全面解析布局(Grid & Canvas &StackPanel &Wrappanel) 转
    WPF-使用面板控制内容布局,比较Canvas,WrapPanel,StackPanel,Grid,ScrollViewer
    C# winform通过按钮上移下移 解决了datasource绑定问题
    经典.net面试题目
    RAID5配置及服务器2003系统安装方法。2000系统的安装要使用7.9版本的引导盘
    (线段树)hdoj1394-Minimum Inversion Number 逆序对
    (线段树)hdoj1754-I Hate It
    (线段树)hdoj1166-敌兵布阵
    Codeforces Round #393 (Div. 2) E题Nikita and stack(线段树)解题报告
  • 原文地址:https://www.cnblogs.com/yi-ye-zhi-qiu/p/8641959.html
Copyright © 2011-2022 走看看