求助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 ;
}