直线石子合并
时间复杂度: O(n3) O ( n 3 ) 。
空间复杂度: O(n2) O ( n 2 ) 。
∀k∈[l,r),dp[l][r]=mindp[l][k]+dp[k+1][r]+∑i=lra[i] ∀ k ∈ [ l , r ) , d p [ l ] [ r ] = min d p [ l ] [ k ] + d p [ k + 1 ] [ r ] + ∑ i = l r a [ i ]
, 为合并区间
[l,r] [ l , r ]
的最小合并代价。
代码:
#include<bits/stdc++.h>
#define LL long long
using namespace std;
const int maxn = 1e3+7;
int dp[maxn][maxn];
int sum[maxn];
int a[maxn];
int inf = 0x3f3f3f3f;
int d(int l,int r){
if(dp[l][r] != inf) return dp[l][r];
for(int k = l;k<r;k++){
dp[l][r] = min(dp[l][r],d(l,k)+d(k+1,r)+sum[r]-sum[l-1]);
}
return dp[l][r];
}
int main(){
ios::sync_with_stdio(0);
int n;cin >> n;
for(int i = 1;i<=n;i++){
cin >> a[i];
sum[i]+=a[i]+sum[i-1];
}
memset(dp,0x3f,sizeof(dp));
for(int i = 0;i<=n;i++)
dp[i][i] = 0;
cout << d(1,n) << endl;
}
圆形石子合并
n∼ 102 n ∼ 10 2
题目链接
注意:此题是多组输入。
解法1
时间复杂度: O(n3) O ( n 3 ) 。
空间复杂度: O(n2) O ( n 2 ) 。
dp方程为
∀k∈[l,r), dp[l][r]=dp[l][k]+∑i=l