题目
题解思路
看了一会区间DP,还没看太懂。
知道递推式是对的,但是不会推。
这题和环形合并石子不同,当确定了起点后,只能往左边或者右边走了。
这样就不需要第三维的K了,确定了len和左右端点,就能知道要么从左边推过来要么从右边推过来了。
环形石子合并有点用了分治的思想,通过局部优推出全局优。
AC代码
#include <bits/stdc++.h>
//#include <unordered_map>
//priority_queue
#define PII pair<int,int>
#define ll long long
using namespace std;
const int INF = 0x3f3f3f3f;
int a[4010] ;
int dp[4010][4010] ;
int main()
{
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
int n ;
cin >> n ;
for (int i = 1 ; i <= n ; i++ )
{
cin >> a[i] ;
a[i+n] = a[i] ;
}
for (int len = 1 ; len <= n ; len++ )
for (int l = 1 ; l + len - 1 <= 2*n ; l++ )
{
int j = l + len - 1 ;
dp[l][j] = max( dp[l+1][j] + len*a[l] , dp[l][j-1] + len*a[j] ) ;
}
int ma = 0 ;
for (int i = 1 ; i <= n ; i++ )
ma = max(ma , dp[i][i+n-1]) ;
cout << ma << "\n" ;
return 0 ;
}