stablegradients/pie-gem5-pairs huggingface dataset:
// Slower C++ solution:
#include <bits/stdc++.h>



using namespace std;



vector<vector<int> > v;

int ans[100005][3];

queue<pair<int,pair<int,int> > >s;

int maior,a=0;



void dp(int i, int bloq, int sum) {

  if(ans[i-1][bloq]>sum)

    return;

  

  if (i>=v.size())

    maior = max(sum, maior);

  else {

    for (int j=0; j<3; j++) {

      if (bloq != j) {



        if(ans[i][j]==-1) {

          ans[i][j] = sum+v[i][j];

          s.push({sum+v[i][j],{i+1,j}});

        }

        else if (ans[i][j]<sum+v[i][j]) {

          ans[i][j] = sum+v[i][j];

          s.push({sum+v[i][j],{i+1,j}});

        }



        //dp(i+1, j, sum+v[i][j]);

      }

    }

  }

}



int main () {

  int n;

  cin>>n;

  for (int i=0; i<n; i++) {

    int a,b,c;

    cin>>a>>b>>c;

    v.push_back({a,b,c});

  }



  maior=0;

  memset(ans, -1, sizeof(ans));

  for (int i=0; i<3; i++) {

    s.push({v[0][i],{1,i}});

    //dp(1, i, v[0][i]);

  }



  while(!s.empty()) {

    pair<int,pair<int,int> > aux = s.front();

    dp(aux.second.first, aux.second.second, aux.first);

    s.pop();

  }



  cout<<maior<<endl;



}




// Faster C++ solution for the same problem (measured speedup: 2.2169074358690875x):
#include<iostream>

#include<algorithm>

using namespace std;

int dp[100010][3];

int a[100010][3];

int main()

{

    int n;

    cin >> n;

    for(int i = 0; i < n; i++)

    {

        cin >> a[i][0] >> a[i][1] >> a[i][2];

    }

    for(int i = 0; i < 3; i++)

        dp[0][i] = a[0][i];

    for(int i = 1; i < n; i++)

    {

        dp[i][0] = a[i][0] + max(dp[i-1][1], dp[i-1][2]);

        dp[i][1] = a[i][1] + max(dp[i-1][0], dp[i-1][2]);

        dp[i][2] = a[i][2] + max(dp[i-1][1], dp[i-1][0]);

    }

    cout << max(dp[n-1][0], max(dp[n-1][1], dp[n-1][2])) << endl;

    return 0;

}
// Slower C++ solution:
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

typedef long long int lli;

typedef long double ld;

const int oo = 1e9;



int n;

const int nx = 1e5+5;

int ac[nx][3];

int dp[3][nx];



int go(int a, int i){

	if(i == n) return 0;

	if(dp[a][i] != -1) return dp[a][i];

	int& ans = dp[a][i];

	

	if(a==0){

		ans=max(ans, go(1, i+1)+ac[i][0]);

		ans=max(ans, go(2, i+1)+ac[i][0]);

	}

	if(a==1){

		ans=max(ans, go(0, i+1)+ac[i][1]);

		ans=max(ans, go(2, i+1)+ac[i][1]);

	}

	if(a==2){

		ans=max(ans, go(0, i+1)+ac[i][2]);

		ans=max(ans, go(1, i+1)+ac[i][2]);

	}

	

	return ans;

}



int main(){

	cin>>n;

	for(int i=0; i<n; i++) cin>>ac[i][0]>>ac[i][1]>>ac[i][2];

	memset(dp, -1, sizeof dp);

	cout<<max(go(0,0),max(go(1,0),go(2,0)))<<"\n";

	return 0;

}


// Faster C++ solution for the same problem (measured speedup: 2.2061284070389093x):
#include<iostream>

#include<algorithm>

using namespace std;

int dp[100010][3];

int a[100010][3];

int main()

{

    int n;

    cin >> n;

    for(int i = 0; i < n; i++)

    {

        cin >> a[i][0] >> a[i][1] >> a[i][2];

    }

    for(int i = 0; i < 3; i++)

        dp[0][i] = a[0][i];

    for(int i = 1; i < n; i++)

    {

        dp[i][0] = a[i][0] + max(dp[i-1][1], dp[i-1][2]);

        dp[i][1] = a[i][1] + max(dp[i-1][0], dp[i-1][2]);

        dp[i][2] = a[i][2] + max(dp[i-1][1], dp[i-1][0]);

    }

    cout << max(dp[n-1][0], max(dp[n-1][1], dp[n-1][2])) << endl;

    return 0;

}
// Slower C++ solution:
#include <bits/stdc++.h>

using namespace std;

const int oo = 1e9;

int number;

const int nx = 1e5+5;

int ac[nx][3];

int dyn[3][nx];

int init(int a, int i){

	if(i == number) return 0;

	if(dyn[a][i] != -1) return dyn[a][i];

	int& res = dyn[a][i];

	

	if(a==0){

		res=max(res, init(1, i+1)+ac[i][0]);

		res=max(res, init(2, i+1)+ac[i][0]);

	}

	if(a==1){

		res=max(res, init(0, i+1)+ac[i][1]);

		res=max(res, init(2, i+1)+ac[i][1]);

	}

	if(a==2){

		res=max(res, init(0, i+1)+ac[i][2]);

		res=max(res, init(1, i+1)+ac[i][2]);

	}

	

	return res;

}

int main(){

	cin>>number;

	for(int i=0; i<number; i++) cin>>ac[i][0]>>ac[i][1]>>ac[i][2];

	memset(dyn, -1, sizeof dyn);

	cout<<max(init(0,0),max(init(1,0),init(2,0)))<<"\n";

	return 0;

}




// Faster C++ solution for the same problem (measured speedup: 2.2061524828417207x):
#include<iostream>

#include<algorithm>

using namespace std;

int dp[100010][3];

int a[100010][3];

int main()

{

    int n;

    cin >> n;

    for(int i = 0; i < n; i++)

    {

        cin >> a[i][0] >> a[i][1] >> a[i][2];

    }

    for(int i = 0; i < 3; i++)

        dp[0][i] = a[0][i];

    for(int i = 1; i < n; i++)

    {

        dp[i][0] = a[i][0] + max(dp[i-1][1], dp[i-1][2]);

        dp[i][1] = a[i][1] + max(dp[i-1][0], dp[i-1][2]);

        dp[i][2] = a[i][2] + max(dp[i-1][1], dp[i-1][0]);

    }

    cout << max(dp[n-1][0], max(dp[n-1][1], dp[n-1][2])) << endl;

    return 0;

}
// Slower C++ solution:
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

typedef long long int lli;

typedef long double ld;

const int oo = 1e9;



int n;

const int nx = 1e5+5;

int ac[nx][3];

int dp[3][nx];

int go(int x, int i){

	if(i==n) return 0;

	if(dp[x][i] != -1) return dp[x][i];

	int& ans = dp[x][i];

	if(x==0)

	{

		ans=max(ans, go(1, i+1)+ac[i][0]);

		ans=max(ans, go(2, i+1)+ac[i][0]);

	}

	if(x==1)

	{

		ans=max(ans, go(0, i+1)+ac[i][1]);

		ans=max(ans, go(2, i+1)+ac[i][1]);

	}

	if(x==2)

	{

		ans=max(ans, go(0, i+1)+ac[i][2]);

		ans=max(ans, go(1, i+1)+ac[i][2]);

	}

	

	return ans;

	

}

int main(){

    cin>>n;

    for(int i=0; i<n; i++) {

            cin>>ac[i][0]>>ac[i][1]>>ac[i][2];

    }

    memset(dp, -1, sizeof dp);

    cout<<max(go(0,0), max(go(1,0),go(2,0)))<<"\n";

    return 0;

}

// Faster C++ solution for the same problem (measured speedup: 2.2061284070389093x):
#include<iostream>

#include<algorithm>

using namespace std;

int dp[100010][3];

int a[100010][3];

int main()

{

    int n;

    cin >> n;

    for(int i = 0; i < n; i++)

    {

        cin >> a[i][0] >> a[i][1] >> a[i][2];

    }

    for(int i = 0; i < 3; i++)

        dp[0][i] = a[0][i];

    for(int i = 1; i < n; i++)

    {

        dp[i][0] = a[i][0] + max(dp[i-1][1], dp[i-1][2]);

        dp[i][1] = a[i][1] + max(dp[i-1][0], dp[i-1][2]);

        dp[i][2] = a[i][2] + max(dp[i-1][1], dp[i-1][0]);

    }

    cout << max(dp[n-1][0], max(dp[n-1][1], dp[n-1][2])) << endl;

    return 0;

}
// Slower C++ solution:
#include<bits/stdc++.h>

using namespace std;

typedef long long ll;



ll arr[100009][3];

int dp[100009][2][2][2];



long long VAC1(int n,int a, int b, int c)

{



    if(!n && a) return arr[n][0];

    else if(!n && b) return arr[n][1];

    else if(!n && c) return arr[n][2];

    else if(dp[n][a][b][c]!=-1)return dp[n][a][b][c];



    else

    {



        ll x,y,z;

        if(a)

        {

            x = VAC1(n-1,0,1,0)+arr[n][0];

            y = VAC1(n-1,0,0,1)+arr[n][0];



        }



        else if(b)

        {

            x = VAC1(n-1,1,0,0)+arr[n][1];

            y = VAC1(n-1,0,0,1)+arr[n][1];

        }



        else if(c)

        {

            x = VAC1(n-1,1,0,0)+arr[n][2];

            y = VAC1(n-1,0,1,0)+arr[n][2];

        }



        dp[n][a][b][c] = max(x,y);;

        return dp[n][a][b][c];





    }

}



int main()

{

   // freopen("in.txt","r",stdin);

    int n;

    memset(dp,-1,sizeof(dp));

    cin >> n;

    for(int i=0; i<n; i++)

    {

        for(int j=0; j<3; j++)

        {

            cin >> arr[i][j];

        }

    }

    ll res = VAC1(n-1,1,0,0);

    res= max(res, VAC1(n-1,0,1,0));

    res = max(res,VAC1(n-1,0,0,1));



    cout << res << endl;

}


// Faster C++ solution for the same problem (measured speedup: 4.2171881482520615x):
#include<iostream>

#include<algorithm>

using namespace std;

int dp[100010][3];

int a[100010][3];

int main()

{

    int n;

    cin >> n;

    for(int i = 0; i < n; i++)

    {

        cin >> a[i][0] >> a[i][1] >> a[i][2];

    }

    for(int i = 0; i < 3; i++)

        dp[0][i] = a[0][i];

    for(int i = 1; i < n; i++)

    {

        dp[i][0] = a[i][0] + max(dp[i-1][1], dp[i-1][2]);

        dp[i][1] = a[i][1] + max(dp[i-1][0], dp[i-1][2]);

        dp[i][2] = a[i][2] + max(dp[i-1][1], dp[i-1][0]);

    }

    cout << max(dp[n-1][0], max(dp[n-1][1], dp[n-1][2])) << endl;

    return 0;

}
// Slower C++ solution:
#include <bits/stdc++.h>

using namespace std;

#define ll long long

ll a[100009],b[100009],c[100009];

int dp[100009][3];

int main() {

    ios::sync_with_stdio(false);

    int n;cin>>n;

    for(int i=1;i<=n;i++)

        cin>>a[i]>>b[i]>>c[i];

    memset(dp,0x3f, sizeof(dp));

    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(max(dp[n][0],dp[n][1]),dp[n][2])<<endl;

    return 0;

}


// Faster C++ solution for the same problem (measured speedup: 2.2188006586682745x):
#include<iostream>

#include<algorithm>

using namespace std;

int dp[100010][3];

int a[100010][3];

int main()

{

    int n;

    cin >> n;

    for(int i = 0; i < n; i++)

    {

        cin >> a[i][0] >> a[i][1] >> a[i][2];

    }

    for(int i = 0; i < 3; i++)

        dp[0][i] = a[0][i];

    for(int i = 1; i < n; i++)

    {

        dp[i][0] = a[i][0] + max(dp[i-1][1], dp[i-1][2]);

        dp[i][1] = a[i][1] + max(dp[i-1][0], dp[i-1][2]);

        dp[i][2] = a[i][2] + max(dp[i-1][1], dp[i-1][0]);

    }

    cout << max(dp[n-1][0], max(dp[n-1][1], dp[n-1][2])) << endl;

    return 0;

}
// Slower C++ solution:
#include <bits/stdc++.h>

using namespace std;



int n;

int dp[100100][4];

vector<int> arr[100100];



int main() {

    cin >> n;

    for (int i = 1; i <= n; ++i) {

        int k;

        for (int j = 0; j < 3; ++j) {

            cin >> k;

            arr[i].push_back(k);

        }

    }



    for (int i = 0; i < 3; ++i) dp[1][i] = arr[1][i];



    for (int pos = 2; pos <= n; ++pos) {

        for (int j = 0; j < 3; ++j) {



            if ( j == 0 ) 

                dp[pos][j] = arr[pos][j] + max(dp[pos - 1][1], dp[pos - 1][2]);

            

            else if ( j == 1 )

                dp[pos][j] = arr[pos][j] + max(dp[pos - 1][0], dp[pos - 1][2]);



            else

                dp[pos][j] = arr[pos][j] + max(dp[pos - 1][0], dp[pos - 1][1]);

        }

    }



    cout << max({dp[n][0], dp[n][1], dp[n][2]}) << endl;

    return 0;

}


// Faster C++ solution for the same problem (measured speedup: 3.5397854823972437x):
#include<iostream>

#include<algorithm>

#include<vector>

using namespace std;

struct day{

	int a;

	int b;

	int c;

};

int main () {

	int n;

    cin>>n;

    day dp[n];

    cin>>dp[0].a>>dp[0].b>>dp[0].c;

	int a1,b1,c1 ;

    for(int i=1;i<n;i++){

    	cin>>a1>>b1>>c1;

    	dp[i].a=max((dp[i-1].b),dp[i-1].c)+a1;

    	dp[i].b=max((dp[i-1].a),dp[i-1].c)+b1;

    	dp[i].c=max((dp[i-1].b),(dp[i-1].a))+c1;

	}

	int ma=0;

	cout<<max(dp[n-1].a,max(dp[n-1].b,dp[n-1].c));

	return 0;

}
// Slower C++ solution:
#include <bits/stdc++.h>

using namespace std;



#define MAX_N 100005

int N, h[MAX_N][3], memo[MAX_N][3];



int main() {

  scanf("%i", &N);

  for (int d = 0; d < N; d++) {

  	for (int c = 0; c < 3; c++) {

  	  scanf("%i", &h[d][c]);

	}

  }

  memset(memo, -1, sizeof memo);

  for (int c = 0; c < 3; c++) {

  	memo[0][c] = h[0][c];

  }

  for (int d = 1; d < N; d++) {

  	for (int c = 0; c < 3; c++) {

  	  int &opt = memo[d][c];

  	  for (int cc = 0; cc < 3; cc++) {

  	    if (cc != c) {

  	      opt = max(opt, memo[d - 1][cc] + h[d][c]);

		  /*

  	      if (d == 1) {

  	        printf("%i %i %i %i\n", memo[d - 1][cc], h[d][c], cc, c);

		  }

		  */

		}

	  }

	}

  }

  /*

  puts("\ndebug");

  for (int d = 0; d < N; d++) {

  	for (int c = 0; c < 3; c++) {

  	  printf("%i ", memo[d][c]);

	}

	puts("");

  }

  puts("end-debug\n");

  */

  int ans = -1;

  for (int c = 0; c < 3; c++) {

  	ans = max(ans, memo[N - 1][c]);

  }

  printf("%i\n", ans);

  

}

// Faster C++ solution for the same problem (measured speedup: 2.1904213914775084x):
#include<iostream>

#include<algorithm>

#include<vector>

using namespace std;

struct day{

	int a;

	int b;

	int c;

};

int main () {

	int n;

    cin>>n;

    day dp[n];

    cin>>dp[0].a>>dp[0].b>>dp[0].c;

	int a1,b1,c1 ;

    for(int i=1;i<n;i++){

    	cin>>a1>>b1>>c1;

    	dp[i].a=max((dp[i-1].b),dp[i-1].c)+a1;

    	dp[i].b=max((dp[i-1].a),dp[i-1].c)+b1;

    	dp[i].c=max((dp[i-1].b),(dp[i-1].a))+c1;

	}

	int ma=0;

	cout<<max(dp[n-1].a,max(dp[n-1].b,dp[n-1].c));

	return 0;

}
// Slower C++ solution:
#include<cstdio>

#include<cstring>

#include<algorithm>

#include<cmath>

using namespace std;

int main()

{

    int n,i,j,k;

    int a[100005][5];

    scanf("%d",&n);

    for(i = 1;i <= n;i++)

    scanf("%d %d %d",&a[i][1],&a[i][2],&a[i][3]);

    int dp[100005][5];

    memset(dp,0,sizeof(dp));

    dp[1][1] = a[1][1];

    dp[1][2] = a[1][2];

    dp[1][3] = a[1][3];

    for(i = 2;i <= n;i++)

    {

        for(j = 1;j < 4;j++)

        {

            for(k = 1;k < 4;k++)

            {

                if(k != j)

                {

                    if(dp[i][j] < dp[i - 1][k] + a[i][j])

                    dp[i][j] = dp[i - 1][k] + a[i][j];

                }

            }

        }

    }

    printf("%d\n",max(dp[n][1],max(dp[n][2],dp[n][3])));

    return 0;

}

// Faster C++ solution for the same problem (measured speedup: 2.2709093703983037x):
#include<iostream>

#include<algorithm>

#include<vector>

using namespace std;

struct day{

	int a;

	int b;

	int c;

};

int main () {

	int n;

    cin>>n;

    day dp[n];

    cin>>dp[0].a>>dp[0].b>>dp[0].c;

	int a1,b1,c1 ;

    for(int i=1;i<n;i++){

    	cin>>a1>>b1>>c1;

    	dp[i].a=max((dp[i-1].b),dp[i-1].c)+a1;

    	dp[i].b=max((dp[i-1].a),dp[i-1].c)+b1;

    	dp[i].c=max((dp[i-1].b),(dp[i-1].a))+c1;

	}

	int ma=0;

	cout<<max(dp[n-1].a,max(dp[n-1].b,dp[n-1].c));

	return 0;

}
// Slower C++ solution:
#include <bits/stdc++.h>



using namespace std;



vector<vector<int> > v;

int ans[100005][3];

queue<pair<int,pair<int,int> > >s;

int maior,a=0;



void dp(int i, int bloq, int sum) {

  if(ans[i-1][bloq]>sum)

    return;

  

  if (i>=v.size())

    maior = max(sum, maior);

  else {

    for (int j=0; j<3; j++) {

      if (bloq != j) {



        if(ans[i][j]==-1) {

          ans[i][j] = sum+v[i][j];

          s.push({sum+v[i][j],{i+1,j}});

        }

        else if (ans[i][j]<sum+v[i][j]) {

          ans[i][j] = sum+v[i][j];

          s.push({sum+v[i][j],{i+1,j}});

        }



        //dp(i+1, j, sum+v[i][j]);

      }

    }

  }

}



int main () {

  int n;

  cin>>n;

  for (int i=0; i<n; i++) {

    int a,b,c;

    cin>>a>>b>>c;

    v.push_back({a,b,c});

  }



  maior=0;

  memset(ans, -1, sizeof(ans));

  for (int i=0; i<3; i++) {

    s.push({v[0][i],{1,i}});

    //dp(1, i, v[0][i]);

  }



  while(!s.empty()) {

    pair<int,pair<int,int> > aux = s.front();

    dp(aux.second.first, aux.second.second, aux.first);

    s.pop();

  }



  cout<<maior<<endl;



}




// Faster C++ solution for the same problem (measured speedup: 2.2204034822362235x):
#include<iostream>

#include<algorithm>

#include<vector>

using namespace std;

struct day{

	int a;

	int b;

	int c;

};

int main () {

	int n;

    cin>>n;

    day dp[n];

    cin>>dp[0].a>>dp[0].b>>dp[0].c;

	int a1,b1,c1 ;

    for(int i=1;i<n;i++){

    	cin>>a1>>b1>>c1;

    	dp[i].a=max((dp[i-1].b),dp[i-1].c)+a1;

    	dp[i].b=max((dp[i-1].a),dp[i-1].c)+b1;

    	dp[i].c=max((dp[i-1].b),(dp[i-1].a))+c1;

	}

	int ma=0;

	cout<<max(dp[n-1].a,max(dp[n-1].b,dp[n-1].c));

	return 0;

}
// Slower C++ solution:
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

typedef long long int lli;

typedef long double ld;

const int oo = 1e9;



int n;

const int nx = 1e5+5;

int ac[nx][3];

int dp[3][nx];



int go(int a, int i){

	if(i == n) return 0;

	if(dp[a][i] != -1) return dp[a][i];

	int& ans = dp[a][i];

	

	if(a==0){

		ans=max(ans, go(1, i+1)+ac[i][0]);

		ans=max(ans, go(2, i+1)+ac[i][0]);

	}

	if(a==1){

		ans=max(ans, go(0, i+1)+ac[i][1]);

		ans=max(ans, go(2, i+1)+ac[i][1]);

	}

	if(a==2){

		ans=max(ans, go(0, i+1)+ac[i][2]);

		ans=max(ans, go(1, i+1)+ac[i][2]);

	}

	

	return ans;

}



int main(){

	cin>>n;

	for(int i=0; i<n; i++) cin>>ac[i][0]>>ac[i][1]>>ac[i][2];

	memset(dp, -1, sizeof dp);

	cout<<max(go(0,0),max(go(1,0),go(2,0)))<<"\n";

	return 0;

}


// Faster C++ solution for the same problem (measured speedup: 2.2096074549585807x):
#include<iostream>

#include<algorithm>

#include<vector>

using namespace std;

struct day{

	int a;

	int b;

	int c;

};

int main () {

	int n;

    cin>>n;

    day dp[n];

    cin>>dp[0].a>>dp[0].b>>dp[0].c;

	int a1,b1,c1 ;

    for(int i=1;i<n;i++){

    	cin>>a1>>b1>>c1;

    	dp[i].a=max((dp[i-1].b),dp[i-1].c)+a1;

    	dp[i].b=max((dp[i-1].a),dp[i-1].c)+b1;

    	dp[i].c=max((dp[i-1].b),(dp[i-1].a))+c1;

	}

	int ma=0;

	cout<<max(dp[n-1].a,max(dp[n-1].b,dp[n-1].c));

	return 0;

}
// Slower C++ solution:
#include <bits/stdc++.h>

using namespace std;

const int oo = 1e9;

int number;

const int nx = 1e5+5;

int ac[nx][3];

int dyn[3][nx];

int init(int a, int i){

	if(i == number) return 0;

	if(dyn[a][i] != -1) return dyn[a][i];

	int& res = dyn[a][i];

	

	if(a==0){

		res=max(res, init(1, i+1)+ac[i][0]);

		res=max(res, init(2, i+1)+ac[i][0]);

	}

	if(a==1){

		res=max(res, init(0, i+1)+ac[i][1]);

		res=max(res, init(2, i+1)+ac[i][1]);

	}

	if(a==2){

		res=max(res, init(0, i+1)+ac[i][2]);

		res=max(res, init(1, i+1)+ac[i][2]);

	}

	

	return res;

}

int main(){

	cin>>number;

	for(int i=0; i<number; i++) cin>>ac[i][0]>>ac[i][1]>>ac[i][2];

	memset(dyn, -1, sizeof dyn);

	cout<<max(init(0,0),max(init(1,0),init(2,0)))<<"\n";

	return 0;

}




// Faster C++ solution for the same problem (measured speedup: 2.209631568728752x):
#include<iostream>

#include<algorithm>

#include<vector>

using namespace std;

struct day{

	int a;

	int b;

	int c;

};

int main () {

	int n;

    cin>>n;

    day dp[n];

    cin>>dp[0].a>>dp[0].b>>dp[0].c;

	int a1,b1,c1 ;

    for(int i=1;i<n;i++){

    	cin>>a1>>b1>>c1;

    	dp[i].a=max((dp[i-1].b),dp[i-1].c)+a1;

    	dp[i].b=max((dp[i-1].a),dp[i-1].c)+b1;

    	dp[i].c=max((dp[i-1].b),(dp[i-1].a))+c1;

	}

	int ma=0;

	cout<<max(dp[n-1].a,max(dp[n-1].b,dp[n-1].c));

	return 0;

}
// Slower C++ solution:
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

typedef long long int lli;

typedef long double ld;

const int oo = 1e9;



int n;

const int nx = 1e5+5;

int ac[nx][3];

int dp[3][nx];

int go(int x, int i){

	if(i==n) return 0;

	if(dp[x][i] != -1) return dp[x][i];

	int& ans = dp[x][i];

	if(x==0)

	{

		ans=max(ans, go(1, i+1)+ac[i][0]);

		ans=max(ans, go(2, i+1)+ac[i][0]);

	}

	if(x==1)

	{

		ans=max(ans, go(0, i+1)+ac[i][1]);

		ans=max(ans, go(2, i+1)+ac[i][1]);

	}

	if(x==2)

	{

		ans=max(ans, go(0, i+1)+ac[i][2]);

		ans=max(ans, go(1, i+1)+ac[i][2]);

	}

	

	return ans;

	

}

int main(){

    cin>>n;

    for(int i=0; i<n; i++) {

            cin>>ac[i][0]>>ac[i][1]>>ac[i][2];

    }

    memset(dp, -1, sizeof dp);

    cout<<max(go(0,0), max(go(1,0),go(2,0)))<<"\n";

    return 0;

}

// Faster C++ solution for the same problem (measured speedup: 2.2096074549585807x):
#include<iostream>

#include<algorithm>

#include<vector>

using namespace std;

struct day{

	int a;

	int b;

	int c;

};

int main () {

	int n;

    cin>>n;

    day dp[n];

    cin>>dp[0].a>>dp[0].b>>dp[0].c;

	int a1,b1,c1 ;

    for(int i=1;i<n;i++){

    	cin>>a1>>b1>>c1;

    	dp[i].a=max((dp[i-1].b),dp[i-1].c)+a1;

    	dp[i].b=max((dp[i-1].a),dp[i-1].c)+b1;

    	dp[i].c=max((dp[i-1].b),(dp[i-1].a))+c1;

	}

	int ma=0;

	cout<<max(dp[n-1].a,max(dp[n-1].b,dp[n-1].c));

	return 0;

}
// Slower C++ solution:
#include<bits/stdc++.h>

using namespace std;

typedef long long ll;



ll arr[100009][3];

int dp[100009][2][2][2];



long long VAC1(int n,int a, int b, int c)

{



    if(!n && a) return arr[n][0];

    else if(!n && b) return arr[n][1];

    else if(!n && c) return arr[n][2];

    else if(dp[n][a][b][c]!=-1)return dp[n][a][b][c];



    else

    {



        ll x,y,z;

        if(a)

        {

            x = VAC1(n-1,0,1,0)+arr[n][0];

            y = VAC1(n-1,0,0,1)+arr[n][0];



        }



        else if(b)

        {

            x = VAC1(n-1,1,0,0)+arr[n][1];

            y = VAC1(n-1,0,0,1)+arr[n][1];

        }



        else if(c)

        {

            x = VAC1(n-1,1,0,0)+arr[n][2];

            y = VAC1(n-1,0,1,0)+arr[n][2];

        }



        dp[n][a][b][c] = max(x,y);;

        return dp[n][a][b][c];





    }

}



int main()

{

   // freopen("in.txt","r",stdin);

    int n;

    memset(dp,-1,sizeof(dp));

    cin >> n;

    for(int i=0; i<n; i++)

    {

        for(int j=0; j<3; j++)

        {

            cin >> arr[i][j];

        }

    }

    ll res = VAC1(n-1,1,0,0);

    res= max(res, VAC1(n-1,0,1,0));

    res = max(res,VAC1(n-1,0,0,1));



    cout << res << endl;

}


// Faster C++ solution for the same problem (measured speedup: 4.2238386222712645x):
#include<iostream>

#include<algorithm>

#include<vector>

using namespace std;

struct day{

	int a;

	int b;

	int c;

};

int main () {

	int n;

    cin>>n;

    day dp[n];

    cin>>dp[0].a>>dp[0].b>>dp[0].c;

	int a1,b1,c1 ;

    for(int i=1;i<n;i++){

    	cin>>a1>>b1>>c1;

    	dp[i].a=max((dp[i-1].b),dp[i-1].c)+a1;

    	dp[i].b=max((dp[i-1].a),dp[i-1].c)+b1;

    	dp[i].c=max((dp[i-1].b),(dp[i-1].a))+c1;

	}

	int ma=0;

	cout<<max(dp[n-1].a,max(dp[n-1].b,dp[n-1].c));

	return 0;

}
// Slower C++ solution:
#include <bits/stdc++.h>

using namespace std;

#define ll long long

ll a[100009],b[100009],c[100009];

int dp[100009][3];

int main() {

    ios::sync_with_stdio(false);

    int n;cin>>n;

    for(int i=1;i<=n;i++)

        cin>>a[i]>>b[i]>>c[i];

    memset(dp,0x3f, sizeof(dp));

    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(max(dp[n][0],dp[n][1]),dp[n][2])<<endl;

    return 0;

}


// Faster C++ solution for the same problem (measured speedup: 2.222299690633538x):
#include<iostream>

#include<algorithm>

#include<vector>

using namespace std;

struct day{

	int a;

	int b;

	int c;

};

int main () {

	int n;

    cin>>n;

    day dp[n];

    cin>>dp[0].a>>dp[0].b>>dp[0].c;

	int a1,b1,c1 ;

    for(int i=1;i<n;i++){

    	cin>>a1>>b1>>c1;

    	dp[i].a=max((dp[i-1].b),dp[i-1].c)+a1;

    	dp[i].b=max((dp[i-1].a),dp[i-1].c)+b1;

    	dp[i].c=max((dp[i-1].b),(dp[i-1].a))+c1;

	}

	int ma=0;

	cout<<max(dp[n-1].a,max(dp[n-1].b,dp[n-1].c));

	return 0;

}