信息
- ID
- 230
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 4
- 标签
- 递交数
- 117
- 已通过
- 55
- 上传者
又双叕是洛谷原题。这也是一道动规题因为标签是动规
重点:
dp[i][j]=max(dp[i][j],dp[j][k]+dp[k][j]+a[i]*a[k]*a[j])
。代码:
#include <iostream>
#include <cstring>
#include <vector>
#include <algorithm>
using namespace std;
int dp[401][401];
int n,a[205];
int main()
{
cin >> n;
for(int i = 1;i <= n;i++)
{
cin >> a[i];
a[n + i] = a[i];//因为这是一个环qwq
}
for(int i = 2;i <= n + 1;i++) //长度
{
for(int j = 1;j + i - 1 <= 2 * n;j++) //起点
{
int endx = j + i - 1; //终点
for(int k = j + 1;k <= j + i - 2;k++) //分界线
{
dp[j][endx] = max(dp[j][endx],dp[j][k] + dp[k][endx] + a[j] * a[k] * a[endx]);
}
}
}
int maxn = -1e9;
for (int i = 1;i <= n;i++)
{
maxn = max(maxn,dp[i][n + i]);
}
cout << maxn;
return 0;
}
环形区间合并模板题,还是比较水的
#include <iostream>
using namespace std;
const int N=1e3+10;
struct node{
int bg;
int ed;
}a[N];
int b[N],dp[N][N];
int main(){
int n;cin>>n;
for(int i=1;i<=n;i++){
cin>>b[i];
b[i+n]=b[i];
}
for(int i=1;i<2*n;i++){
a[i].bg=b[i],a[i].ed=b[i+1];
}
a[2*n].bg=b[2*n],a[2*n].ed=b[1];
for(int i=2*n-1;i>=1;i--){
for(int j=i+1;j<=2*n&&j-i+1<=n;j++){
for(int k=i;k<j;k++){
dp[i][j]=max(dp[i][j],dp[i][k]+dp[k+1][j]+a[i].bg*a[k].ed*a[j].ed);
}
}
}
int mx=0;
for(int i=1;i<=n;i++){
mx=max(mx,dp[i][i+n-1]);
}
cout<<mx<<endl;
return 0;
}