石子合并40分,最大值出错求调
查看原帖
石子合并40分,最大值出错求调
296632
季务融楼主2022/8/25 19:04

求助QAQ,算最大值的时候WA了。

测试数据:

46
16 4 14 12 0 3 11 8 18 2 6 8 6 7 13 7 8 14 11 2 16 12 16 0 8 1 3 10 7 16 0 16 11 17 13 18 5 15 0 12 19 0 0 5 3 1 

答案是:

2087
10554

程序输出:

2087
10454

实在调不出来了ORZ

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;

int dp[505][505] , n , a[505] , s[505] , ans = 0 ;

int main ()
{
	scanf("%d",&n);
	for ( int i = 1 ; i <= n ; i++ )
		scanf("%d",&a[i]) , a[i+n] = a[i];
	memset(dp,0x3f3f3f3f,sizeof dp);
	for ( int i = 1 ; i <= 2*n ; i++ ) 
			s[i] = s[i-1]+a[i] , dp[i][i] = 0;
	for ( int len = 2 ; len <= n ; len++ )
		for ( int i = 1 , j = i+len-1 ; i <= n ; i++ , j = i+len-1 ) 
				for ( int k = i ; k <= j-1 ; k++ )
					dp[i][j] = min(dp[i][j],dp[i][k]+dp[k+1][j]+s[j]-s[i-1]);
	ans = 0x3f3f3f3f;
	for ( int i = 1 ; i <= n ; i++ )
		ans = min(ans,dp[i][i+n-1]);
	printf("%d\n",ans);
	
	memset(dp,0,sizeof dp);
	for ( int len = 2 ; len <= n ; len++ )
			for ( int i = 1 , j = i+len-1 ; i <= n ; i++ , j = i+len-1 ) 
					for ( int k = i ; k <= j-1 ; k++ )
						dp[i][j] = max(dp[i][j],dp[i][k]+dp[k+1][j]+s[j]-s[i-1]);		
	ans = 0;
	for ( int i = 1 ; i <= n ; i++ )
			ans = max(ans,dp[i][i+n-1]);
	printf("%d\n",ans);
	return 0 ;
}
2022/8/25 19:04
加载中...