区间DP0分求调
查看原帖
区间DP0分求调
409774
Maysoul楼主2023/7/7 19:26

代码就是P1775略微做了点修改

验证码:cdtj(抄的题解?然而并没有

//2023/7/7
//别着急,先通读一遍题目
//别忘了开long long
//写完先看一遍怎么降复杂度
//要么开全局变量要么给定初值
//想想看,有什么情况需要特判
//看看数组开的够不够大
//std::ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
#include<bits/stdc++.h>
using namespace std;
const int MAXN=110;
int num,ans;
int sum[MAXN],dp[MAXN][MAXN],a[MAXN];
int pd[MAXN][MAXN];
int main()
{
	int n; 
	cin>>n;
	for (int i=1;i<=n;i++)	cin>>a[i];
	memset(dp,0x3f,sizeof(dp));
	memset(pd,0xcf,sizeof(pd));
	for (int i=1;i<=n;i++){
		dp[i][i]=0;
		pd[i][i]=0;
		sum[i]=sum[i-1]+a[i];
	}
	for (int len=2;len<=n;len++){
		for (int l=1;l<=n-len+1;l++){
			int r=l+len-1;
			for (int k=l;k<r;k++){
				dp[l][r]=min(dp[l][r],dp[l][k]+dp[k+1][r]);
				pd[l][r]=max(pd[l][r],pd[l][k]+pd[k+1][r]);
			}
			dp[l][r]+=sum[r]-sum[l-1];
			pd[l][r]+=sum[r]-sum[l-1];
		}
	}
	cout<<dp[1][n]<<'\n';
	cout<<pd[1][n]<<'\n';
	return 0;
}
2023/7/7 19:26
加载中...