石子归并
记忆化搜索:
#include<bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
#define maxn 111
int dp[maxn][maxn];
int sum[maxn],n,a;
int dfs(int l,int r)
{
if(l==r)return 0;
if(dp[l][r]!=inf)
return dp[l][r];
for(int i=l; i<r; i++)
dp[l][r]=min(dp[l][r],dfs(l,i)+dfs(i+1,r)+sum[r]-sum[l-1]);
return dp[l][r];
}
int main()
{
cin>>n;
for(int i=1; i<=n; i++)
{
cin>>a;
sum[i]=sum[i-1]+a;
}
memset(dp,inf,sizeof(dp));
cout<<dfs(1,n)<<endl;
return 0;
}
区间dp:
#include<bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
#define maxn 111
int dp[maxn][maxn];
int sum[maxn],n,a;
int main()
{
cin>>n;
memset(dp,inf,sizeof(dp));
for(int i=1; i<=n; i++)
{
cin>>a;
sum[i]=sum[i-1]+a;
dp[i][i]=0;
}
for(int len=1; len<n; len++)
for(int i=1; i+len<=n; i++)
for(int j=i; j<i+len; j++)
dp[i][i+len]=min(dp[i][i+len],dp[i][j]+dp[j+1][i+len]+sum[i+len]-sum[i-1]);
cout<<dp[1][n]<<endl;
return 0;
}