无聊的假期

Problem Statement

明天就是Alice最不喜欢的寒假了,因为寒假期间都没有什么有趣的活动。
为了使寒假不那么无聊,Alice想先制定一个寒假计划表

整个寒假共有N 天. 对于第 i (1 ≤ i ≤ N)天, Alice将会从如下三项活动中选出一项作为这天的主要项目

  • A: 打网球. 可以获得 ai 的快乐值.
  • B: 赛车. 可以获得 bi 的快乐值.
  • C: 读书. 可以获得 ci 的快乐值.

Alice觉得相邻两天都做同样的事情会非常无聊,所以任何相邻两天的项目都不能重复.

请帮Alice制定一个寒假计划可使Alice在整个假期中能获得最大的快乐值,输出这个最大的快乐值。

Constraints

  • 所有数据都是整数.
  • 1 ≤ N ≤ 105
  • 1 ≤ ai, bi, ci ≤ 104
Input

输入数据将按以下形式给出:

N
a1 b1 c1
a2 b2 c2
:
:
aN bN cN
Output

输出一行,一个整数,表示Alice寒假可能获得的最大快乐值.

Sample Input 1

3
10 40 70
20 50 80
30 60 90
Sample Output 1

210

Hint

如果Alice按照 C, B, C,的计划,则会得到 70 + 50 + 90 = 210 点快乐值,是所有计划中最大的.

Sample Input 2

1
100 10 1
Sample Output 2

100
Sample Input 3

7
6 7 8
8 8 3
2 5 2
7 8 6
4 6 8
2 3 4
7 5 1
Sample Output 3

46

Hint

可以按照 C, A, B, A, C, B, A的计划进行.

Sponsor
/*
思路: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;
 } 
发布了45 篇原创文章 · 获赞 21 · 访问量 461

猜你喜欢

转载自blog.csdn.net/qq_40394960/article/details/105170969
今日推荐