第一次做区间DP,有个小小的问题
查看原帖
第一次做区间DP,有个小小的问题
858608
BreadCakeCheese楼主2024/7/30 15:35

自己写的代码是这样的 样例过不了:

#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;
}

想问一下这是为什么呀?难道总能量最多时不是所有珠子都合并了吗?

2024/7/30 15:35
加载中...