计蒜客——一维消消乐(理解dp)
/*注释中有思路*/#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
·
/*注释中有思路*/
#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
*/
更多推荐
已为社区贡献1条内容
所有评论(0)