uva10003 - Cutting Sticks(简单动规)

来源:互联网 发布:沈阳工业大学知乎 编辑:程序博客网 时间:2024/05/20 11:22

第一道动规题目,昨天看的题目,今天才做出来,,昨天理解错题意了,

题目说的是绝对切割长度,而不是相对的,请注意。。。

思路:

对切割顺序进行枚举,

对于需要切割的长度【25,50,75】则寻找第一次切割的位置。所以对位置25,50,75各来一次。其实这样还是暴力,只不过表格记录了已经计算过的状态,省时一些罢了。

这里我用的是从底向上递推来填表的

注意这里的小技巧:对于【25,50,75】来说。存的时候把0和100也要存进去。【0,25,50,75,100】

状态方程:f[m][n] = min{f[m][k]+f[k][n]+a[n]-a[m];}(m<k<n)

代码如下:

#include <cstdio>#define N 55#define INF 0xfffffffint l, n, a[N], dp[N][N];void solve(){    for(int i = 1; i < n; i++) dp[i][i+1] = 0;    for(int len = 2; len < n; len++)    for(int s = 1;  s <= n-len; s++)    {        int &ans = dp[s][s+len], tt;        ans = INF;        for(int k = s; k < s+len; k++)        {            tt = dp[s][k]+dp[k][s+len]+a[s+len]-a[s];            ans = ans>tt?tt:ans;        }    }}int main(){    while(scanf("%d",&l),l)    {        scanf("%d",&n);        a[1] = 0;        for(int i = 2; i <= n+1; i++) scanf("%d",&a[i]);        a[n+=2] = l;        solve();        printf("The minimum cutting is %d.\n",dp[1][n]);    }    return 0;}


 

原创粉丝点击