UVA 10003 切木棍(普通DP)

切木棍

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

【题目链接】切木棍

【题目类型】普通DP

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

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

&代码:

#include 
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)<=0;i--){
            for(int j=i+2;j<=n+1;j++){
                int mint=INF;
                for (int k=i+1;k>T;while(T--)
    Solve();
    return 0;
}

转载于:https://www.cnblogs.com/s1124yy/p/5968337.html

你可能感兴趣的:(UVA 10003 切木棍(普通DP))