Sicily 1345:能量项链(dp)
#include <bits/stdc++.h> using namespace std; int main(){ int n; while(cin >> n){ int arr[n]; for(int i = 0; i < n; i++)cin >> arr[i]; int dp[n][n+1]; //使用dp[i][j]代表从第i个数字往后合并j位的最大能量 memset(dp, 0, sizeof(dp)); for(int i = 0; i < n; i++){ dp[i][2] = arr[i]*arr[(i+1)%n]*arr[(i+2)%n]; } //dp[i][0] = dp[i][1] = 0, dp[i][2]为连续三数字相乘 for(int j = 3; j <= n; j++){ for(int i = 0; i < n; i++){ int ans = 0; for(int k = 1; k < j; k++){ ans = max(ans, dp[i][k]+dp[(i+k)%n][j-k]+arr[i]*arr[(i+k)%n]*arr[(i+j)%n]); } // 状态转移 dp[i][j] = ans; } } int ans = 0; for(int i = 0; i < n; i++){ ans = max(ans, dp[i][n]); // 遍历得出最大值 } cout << ans << endl; } }