(假)DP最大值算错?求大佬帮助
查看原帖
(假)DP最大值算错?求大佬帮助
123078
C_Z_C楼主2020/8/28 11:31

rt,代码如下:

#include<iostream>
#include<cstring>
using namespace std;
int n,m,dp[205][205],a[205],maxn=0x3f3f3f3f,f[205][205];
int main(){
    cin>>n;
	memset(dp,0x3f,sizeof(dp));
	memset(f,0x3f,sizeof(f));
    for(int i=1;i<=n;i++){
    	cin>>a[i];
    	a[i+n]=a[i];
    	dp[i][i]=dp[i+n][i+n]=a[i];
		f[i][i]=f[i+n][i+n]=0;
	}
	for(int i=1;i<n;i++) //求最小值
    	for(int j=1;j<=n;j++)
    		for(int k=j+1;k<=i+j;k++){
    			if(f[j][k-1]+f[k][j+i]+dp[j][k-1]+dp[k][i+j]<f[j][i+j]) dp[j][i+j]=dp[j][k-1]+dp[k][i+j],f[j][i+j]=f[j][k-1]+f[k][j+i]+dp[j][i+j];
    			if(i+j<=n) f[j+n][i+j+n]=f[j][i+j];
			}		
	for(int i=1;i<=n;i++) maxn=min(maxn,f[i][i+n-1]);
	cout<<maxn<<'\n';
	maxn=0;
	memset(dp,0,sizeof(dp));
	memset(f,0,sizeof(f));
    for(int i=1;i<=n;i++) dp[i][i]=dp[i+n][i+n]=a[i];
    for(int i=1;i<n;i++) //求最大值
    	for(int j=1;j<=n;j++)
    		for(int k=j+1;k<=i+j;k++){
    			if(f[j][k-1]+f[k][j+i]+dp[j][k-1]+dp[k][i+j]>=f[j][i+j]) dp[j][i+j]=dp[j][k-1]+dp[k][i+j],f[j][i+j]=f[j][k-1]+f[k][j+i]+dp[j][i+j];
				if(i+j<=n) f[j+n][i+j+n]=f[j][i+j];
			}
	for(int i=1;i<=n;i++) maxn=max(maxn,f[i][i+n-1]);
	cout<<maxn;
	return 0;
}
2020/8/28 11:31
加载中...