第一道动规题目,昨天看的题目,今天才做出来,,昨天理解错题意了,
题目说的是绝对切割长度,而不是相对的,请注意。。。
思路:
对切割顺序进行枚举,
对于需要切割的长度【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 0xfffffff int 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; }