题解:dp[ i ][ j ]=min { dp[ i ][ k ]+dp[ k ][ j ] }+a[ j ]-a [i ]。
和石子归并是一样的问题,枚举区间的长度,然后更新这个区间的值。
1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 #include<algorithm> 5 #define INF 1e8 6 using namespace std; 7 8 int n,L; 9 int a[50],dp[50][50]; 10 11 void solve() 12 { for(int i=0;i<=n;i++) dp[i][i+1]=0; 13 for(int len=2;len<=n+1;len++){ 14 for(int i=0;i+len<=n+1;i++){ 15 int j=len+i; 16 for(int k=i+1;k<j;k++) dp[i][j]=min(dp[i][j],dp[i][k]+dp[k][j]); 17 dp[i][j]+=a[j]-a[i]; 18 } 19 } 20 21 printf("The minimum cutting is %d. ",dp[0][n+1]); 22 } 23 24 int main() 25 { while(cin>>L&&L){ 26 cin>>n; 27 for(int i=1;i<=n;i++) cin>>a[i]; 28 a[0]=0,a[n+1]=L; 29 memset(dp,0x3f,sizeof(dp)); 30 solve(); 31 } 32 return 0; 33 }