[普及]93768题解
2025-12-09 20:45:58
发布于:广东
10阅读
0回复
0点赞
题目大意
过于简单,不在累赘,请自行理解
思路
考虑 dp。
设 为第 天选择活动 时的最大总愉悦值,其中 分别对应活动 。同时由于不能连续两次选择一样的活动,即 与 无关联。
稍加思考后,我们得出,对于时的转移方程:
初始状态:
最后输出 中情况里的最大值即可(即最后一天分别选择活动 A,B,C)
AC代码
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 5;
#define int long long
int dp[N][3] , a[N] , b[N] , c[N] , n;//其中0表示本天选A,1表示选B,2表示选C
signed main(){
cin >> n;
for(int i = 1;i <= n;i ++) cin >> a[i] >> b[i] >> c[i];
dp[1][0] = a[1] , dp[1][1] = b[1] , dp[1][2] = c[1];
for(int i = 2;i <= n;i ++){//动态转移方程
dp[i][0] = max(dp[i - 1][1] , dp[i - 1][2]) + a[i];
dp[i][1] = max(dp[i - 1][0] , dp[i - 1][2]) + b[i];
dp[i][2] = max(dp[i - 1][0] , dp[i - 1][1]) + c[i];
}
cout << max({dp[n][0] , dp[n][1] , dp[n][2]});
return 0;
}
当然,可以进行滚动数组优化/使用递推以做到更好性能。但是会导致代码可读性降低,因此不给出代码。(实际是上不想写)
这里空空如也

有帮助,赞一个