![OJ-P1802【种树】 - 真·牛玉鑫 - 真-牛玉鑫的博客 OJ-P1802【种树】 - 真·牛玉鑫 - 真-牛玉鑫的博客](http://img2.ph.126.net/T0aGYX4DMOWyjGGJTClm4g==/871165053019688165.jpg)
还需要多练……不过还是省选之后吧,这一段先搞总结。#include<iostream>
#include<iomanip>
#include<string>
#include<cstring>
#include<algorithm>
#include<cstdio>
using namespace std;
int n,map[100086][5],F[100086][3],anss=0;
void init()
{
cin>>n;
for(int i=1;i<=n;i++)
for(int j=1;j<=3;j++)
cin>>map[i][j];
}
int main()
{
ios::sync_with_stdio(false);
init();
//===========100========
memset(F,-7,sizeof(F));
F[1][1]=map[1][1];
for(int i=2;i<=n;i++)
for(int j=1;j<=3;j++)
if(F[i-1][j]>0)
{
if(i%2==0)
for(int k=j+1;k<=3;k++)
F[i][k]=max(F[i][k],F[i-1][j]+map[i][k]);
else
for(int k=1;k<j;k++)
F[i][k]=max(F[i][k],F[i-1][j]+map[i][k]);
}
for(int i=2;i<=3;i++) if(anss<F[n][i]) anss=F[n][i];
//===========150,先小========
memset(F,-7,sizeof(F));
F[1][2]=map[1][2];
for(int i=2;i<=n;i++)
for(int j=1;j<=3;j++)
if(F[i-1][j]>0)
{
if(i%2==1)
for(int k=j+1;k<=3;k++)
F[i][k]=max(F[i][k],F[i-1][j]+map[i][k]);
else
for(int k=1;k<j;k++)
F[i][k]=max(F[i][k],F[i-1][j]+map[i][k]);
}
if(anss<F[n][1]) anss=F[n][1];
//===========150,先大========
memset(F,-7,sizeof(F));
F[1][2]=map[1][2];
for(int i=2;i<=n;i++)
for(int j=1;j<=3;j++)
if(F[i-1][j]>0)
{
if(i%2==0)
for(int k=j+1;k<=3;k++)
F[i][k]=max(F[i][k],F[i-1][j]+map[i][k]);
else
for(int k=1;k<j;k++)
F[i][k]=max(F[i][k],F[i-1][j]+map[i][k]);
}
if(anss<F[n][3]) anss=F[n][3];
//===========200========
memset(F,-7,sizeof(F));
F[1][3]=map[1][3];
for(int i=2;i<=n;i++)
for(int j=1;j<=3;j++)
if(F[i-1][j]>0)
{
if(i%2==1)
for(int k=j+1;k<=3;k++)
F[i][k]=max(F[i][k],F[i-1][j]+map[i][k]);
else
for(int k=1;k<j;k++)
F[i][k]=max(F[i][k],F[i-1][j]+map[i][k]);
}
for(int i=1;i<=2;i++) if(anss<F[n][i]) anss=F[n][i];
cout<<anss<<endl;
return 0;
}