zoukankan      html  css  js  c++  java
  • UVA 10003 切木棍(普通DP)

    切木棍

    紫书P278 算是简单的dp了吧,当然,这是看完别人题解后的想法,呵呵,我仍然是想了半小时,没思路,啥时候能自个整个dp啊!!→_→
    dp的时候,输入数组必须从1开始,一定要注意状态的设计,和初始化边界。
    必须写成递推,不要写dfs。

    【题目链接】切木棍

    【题目类型】普通DP

    &题解:
    分析书上有,我就说说我的理解吧:
    我还是觉得dp一定要先想到dp数组各维代表的东西,和值的意义,这真的是很难想到的。就比如这题:dp[i][j]=切割小木棍i~j的最优费用。这种感觉也就只能通过多做题弥补了。
    这个刚开始以为要(len2)才行,但仔细想想发现枚举是n,n才50,那么(n3)也就可以过了。
    还有,刚开始i的循环写错了,写成正着的了,怎么都不出样例。最后才发现,递推明显是倒着来的嘛,mdzz。

    【时间复杂度】O((n^3))

    &代码:

    #include <bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    const int INF = 0x3f3f3f3f;
    #define cle(a,val) memset(a,(val),sizeof(a))
    #define SI(N) scanf("%d",&(N))
    #define SII(N,M) scanf("%d %d",&(N),&(M))
    #define SIII(N,M,K) scanf("%d %d %d",&(N),&(M),&(K))
    #define rep(i,b) for(int i=0;i<(b);i++)
    #define rez(i,a,b) for(int i=(a);i<=(b);i++)
    #define red(i,a,b) for(int i=(a);i>=(b);i--)
    const ll LINF = 0x3f3f3f3f3f3f3f3f;
    #define PU(x) puts(#x);
    #define PI(A) cout<<(A)<<endl;
    #define DG(x) cout<<#x<<"="<<(x)<<endl;
    #define DGG(x,y) cout<<#x<<"="<<(x)<<" "<<#y<<"="<<(y)<<endl;
    #define DGGG(x,y,z) cout<<#x<<"="<<(x)<<" "<<#y<<"="<<(y)<<" "<<#z<<"="<<(z)<<endl;
    #define PIar(a,n) rep(i,n)cout<<a[i]<<" ";cout<<endl;
    #define PIarr(a,n,m) rep(aa,n){rep(bb, m)cout<<a[aa][bb]<<" ";cout<<endl;}
    const double EPS = 1e-9 ;
    /*  ////////////////////////   C o d i n g  S p a c e   ////////////////////////  */
    const int MAXN = 50 + 9 ;
    int n,len,dp[MAXN][MAXN];
    int a[MAXN];
    void Solve()
    {
        while(~SI(len),len){
            SI(n);
            rez(i,1,n)SI(a[i]);
            a[n+1]=len;
            for(int i=n-1;i>=0;i--){
                for(int j=i+2;j<=n+1;j++){
                    int mint=INF;
                    for (int k=i+1;k<j;k++){
                        mint=min(mint,dp[i][k]+dp[k][j]+a[j]-a[i]);
                    }
                    dp[i][j]=mint;
                }
            }
            printf("The minimum cutting is %d.
    ",dp[0][n+1]);
            // PIarr(dp,19,19)
        }
    }
    int main()
    {
    #ifndef ONLINE_JUDGE
        freopen("1.in", "r", stdin);
        freopen("1.out","w",stdout);
    #endif
    //iostream::sync_with_stdio(false);
    //cin.tie(0), cout.tie(0);
        // int T;cin>>T;while(T--)
        Solve();
        return 0;
    }
    
  • 相关阅读:
    File类与字节流
    字符流
    二进制文件的读写与小结
    下拉列表框与线性、帧布局管理器
    android第二章控件2
    第一章
    安卓时间
    2017《Java技术》 预留作业2 胡开辉
    2017 《JAVA技术》 胡开辉
    ESB产品对比
  • 原文地址:https://www.cnblogs.com/s1124yy/p/5968337.html
Copyright © 2011-2022 走看看