明天就是Alice最不喜欢的寒假了,因为寒假期间都没有什么有趣的活动。
为了使寒假不那么无聊,Alice想先制定一个寒假计划表
整个寒假共有N 天. 对于第 i (1 ≤ i ≤ N)天, Alice将会从如下三项活动中选出一项作为这天的主要项目
- A: 打网球. 可以获得 ai 的快乐值.
- B: 赛车. 可以获得 bi 的快乐值.
- C: 读书. 可以获得 ci 的快乐值.
Alice觉得相邻两天都做同样的事情会非常无聊,所以任何相邻两天的项目都不能重复.
请帮Alice制定一个寒假计划可使Alice在整个假期中能获得最大的快乐值,输出这个最大的快乐值。
- 所有数据都是整数.
- 1 ≤ N ≤ 105
- 1 ≤ ai, bi, ci ≤ 104
输入数据将按以下形式给出:
N a1 b1 c1 a2 b2 c2 : : aN bN cN
输出一行,一个整数,表示Alice寒假可能获得的最大快乐值.
3 10 40 70 20 50 80 30 60 90
210
Hint
如果Alice按照 C, B, C,的计划,则会得到 70 + 50 + 90 = 210 点快乐值,是所有计划中最大的.
1 100 10 1
100
7 6 7 8 8 8 3 2 5 2 7 8 6 4 6 8 2 3 4 7 5 1
46
Hint
可以按照 C, A, B, A, C, B, A的计划进行.
/*
思路:dp dp[i][j]表示第i天参加选择第j项运动的最大快乐
状态转移方程为dp[i][j]=max(dp[i-1][(j-1+3)%3],dp[i-1][(j+2+3)%3])+a[i][j]
*/
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
int dp[100000][3];
int main()
{
int n;
cin>>n;
int a[n][3];
for(int i = 0; i < n; i++)
cin>>a[i][0]>>a[i][1]>>a[i][2];
dp[0][0]=a[0][0];
dp[0][1]=a[0][1];
dp[0][2]=a[0][2];
for(int i =1;i < n; i++)
{
for(int j = 0; j < 3; j++)
{
dp[i][j]= max(dp[i-1][(j-1+3)%3],dp[i-1][(j+1+3)%3])+a[i][j];
}
}
cout<<max(dp[n-1][0],max(dp[n-1][1],dp[n-1][2]));
return 0;
}