添加链接描述
法一:迭代
#include<bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
int dp[105][105];
int w[105][105],a[105];
int n;
int main()
{
int t;
cin>>t;
while(t--){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
memset(w,0,sizeof w);
for(int i=1;i<=n;i++){
w[i][i]=a[i];
for(int j=1;j<=n;j++){
if(i==j){
dp[i][i]=0;
}
else dp[i][j]=inf;
}
}
for(int len=2;len<=n;len++){
for(int i=1;i<=n;i++){
int j=i+len-1;
if(j>n) break;
for(int k=i;k<j;k++){
w[i][j]=w[i][k]+w[k+1][j];
dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j]+w[i][j]);
}
}
}
cout<<dp[1][n]<<endl;
}
return 0;
}
法二:记忆化dfs
#include<bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
int dp[105][105];
int sum[105],a[105],s[105];
int n;
int dfs(int l,int r){
int &D=dp[l][r];
if(D!=inf) return D;
if(l==r) return D=0;
for(int i=l;i<r;i++) D=min(D,dfs(l,i)+dfs(i+1,r)+sum[r]-sum[l-1]);
return D;
}
int main()
{
int t;
scanf("%d",&t);
while(t--){
scanf("%d",&n);
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int i=1;i<=n;i++){
s[i]=a[i];
for(int j=1;j<=n;j++){
if(i==j){
dp[i][i]=0;
}
else dp[i][j]=inf;
}
}
memset(sum,0,sizeof sum);
sum[1]=s[1];
for(int i=2;i<=n;i++)
{
sum[i]=sum[i-1]+s[i];
}
printf("%d\n",dfs(1,n));
}
return 0;
}