/*注释中有思路*/

#include<iostream>
using namespace std;

int w[10005];
int dp[10005][2];  //1表示与前边珠子一起结合消去,0表示没有消去

int main() {
	int n;
	cin >> n;
	for (int i = 1; i <= n; ++i) {
		cin >> w[i];
	}

	dp[1][0] = 0;
	//从第二颗珠子起,每颗珠子都有两种状态,结合与不结合,先将两种状态分别求出,由下一个状态判断当前哪种状态最优,部分状态最优->整体状态最优	
	for (int i = 2; i <= n; ++i) {
		dp[i][0] = max(dp[i - 1][0], dp[i - 1][1]);  //如果当前珠子不与前面珠子结合,前面珠子结不结合与当前状态无关,取前一颗珠子状态最大值
		dp[i][1] = dp[i - 1][0] + w[i] * w[i - 1];   //如果当前珠子跟前面珠子结合,则必须要求前面珠子没有结合,则当前状态为
	}
	cout << max(dp[n][0], dp[n][1]) << endl;

	system("pause");
	return 0;
}
/*
8
-9 -5 -4 -2 4 -5 -4 2
*/

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐