自己写的代码是这样的 样例过不了:
#include<bits/stdc++.h>
using namespace std;
const int N=205;
int n,ans=0,h[N],dp[N][N];
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>h[i];
h[i+n]=h[i];
}
for(int i=2;i<2*n;i++){ //i枚举区间右端点
for(int j=i-1;j>=1&&i-j+1<=n;j--){ //j枚举区间左端点
for(int k=j;k<i;k++){ //k枚举划分点
dp[j][i]=max(dp[j][i],dp[j][k]+dp[k+1][i]+(h[j]*h[k+1]*h[i+1]));
}
}
}
for(int i=1;i<=n;i++){
ans=max(ans,dp[i][i+n]);
}
cout<<ans;
return 0;
}
对着第一篇题解调成了这样,就过了
#include<bits/stdc++.h>
using namespace std;
const int N=205;
int n,ans=0,h[N],dp[N][N];
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>h[i];
h[i+n]=h[i];
}
for(int i=2;i<2*n;i++){ //i枚举区间右端点
for(int j=i-1;j>=1&&i-j+1<=n;j--){ //j枚举区间左端点
for(int k=j;k<i;k++){ //k枚举划分点
dp[j][i]=max(dp[j][i],dp[j][k]+dp[k+1][i]+(h[j]*h[k+1]*h[i+1]));
if(dp[j][i]>ans) ans=dp[j][i];
}
}
}
cout<<ans;
return 0;
}
想问一下这是为什么呀?难道总能量最多时不是所有珠子都合并了吗?