20180524--DP2 (区间DP)

W - Cutting Sticks


题意:一根木棍,中间有n个可分割点,每次分割加上分割的木棍的长度,然后让你求最小的切割顺序(使得和最小)

思路:区间DP,三重循环,用k枚举相差的割点的长度,i枚举起点,e枚举终点,j枚举中间点,求最小即可

代码:

#include <bits/stdc++.h>
using namespace std;
const int M=1005;
int dp[M][M];
int n,a[M];
int st;
int main()
{
    while(cin>>st&&st)
    {
        cin>>n;
        for(int i=1;i<=n;i++)
        {
            cin>>a[i];
        }
        a[0]=0;
        a[n+1]=st;
        memset(dp,0,sizeof(dp));
        for(int k=2;k<=n+1;k++) ///length
        {
            for(int i=0;i<=n+1;i++)
            {
                int e=i+k;
                for(int j=i+1;j<e;j++)
                {
                    if(!dp[i][e]) dp[i][e]=dp[i][j]+dp[j][e]+a[e]-a[i];
                    else
                        dp[i][e]=min(dp[i][e],dp[i][j]+dp[j][e]+a[e]-a[i]);
                }
            }
        }
        cout<<"The minimum cutting is "<<dp[0][n+1]<<"."<<endl;
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/sinat_37668729/article/details/80445422