链接:https://www.acwing.com/problem/content/284/
思路:参考带环的石子合并,代码除了多了个循环一模一样
代码:
1 #include<bits/stdc++.h> 2 #define inf 0x3f3f3f3f 3 using namespace std; 4 typedef long long ll; 5 typedef long double ld; 6 const int M = int(1e6)*2 + 5; 7 const int mod = 10056; 8 inline int lowbit(int x) { 9 return x & (-x); 10 } 11 12 int a[M]; 13 int dp[1050][1050]; 14 int sum[M]; 15 int main() 16 { 17 memset(dp,inf,sizeof(dp)); 18 19 int n;cin>>n; 20 for(int i=1;i<=n;i++){ 21 cin>>a[i]; 22 sum[i]=sum[i-1]+a[i]; 23 dp[i][i]=0; 24 } 25 26 for(int len=2;len<=n;len++){ 27 for(int l=1;l<=n-len+1;l++){ 28 int r=l+len-1; 29 for(int k=l;k<r;k++){ 30 dp[l][r]=min(dp[l][r],dp[l][k]+dp[k+1][r]); 31 } 32 dp[l][r]+=(sum[r]-sum[l-1]); 33 } 34 } 35 36 cout<<dp[1][n]<<endl; 37 return 0; 38 }
备注:AcWing真的是一个很好的网站,吹爆