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;
}