本题是一道多维DP题目,那么在不打开算法标签的情况下怎么去想呢,
首先是题目的求的是最值,比较好想到的就是动态规划。首先是本题的种植范围限在一维,但是有种类要求,可以把高度10,20,30简单理解为种类1,2,3(因为没有其他奇奇怪怪的东西)。
我们需要一维记录位置,二维记录种类,而教主大人又有特殊审美,所以要对树之间进行判断,三维记录前一个树的种类,而植树场地又是一个环,所以...再开一维特判1和n的种类,即记录第一课树的种类。所以...int f[100010][4][4][4],虽然是4维数组但是后三维所需要记录的量(种类)不多,所以相对较小,这种方法是可行的。可以列出转移方程:
f[i][j][x][z]=max(f[i][j][x][z],f[i-1][x][y][z]+v[i][j]);
其中v[i][j]是记录当前格可产生的观赏价值。j,x,y,z都是种类。
代码如下
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int f[100010][5][5][5];
int v[100010][5],maxx;
int main(){
int n;
scanf("%d",&n);
for (int i=0;i<n;i++)
{
scanf("%d %d %d",&v[i][1],&v[i][2],&v[i][3]);
}
for (int i=1;i<4;i++){
for (int j=1;j<4;j++){
f[0][i][j][i]=v[0][i];
}
}
for (int i=1;i<n;i++)
{
for (int j=1;j<4;j++)
{
for (int x=1;x<4;x++)
{
for (int y=1;y<4;y++)
{
for (int z=1;z<4;z++)
if ((y>x && x<j) || (y<x && x>j))
{
f[i][j][x][z]=max(f[i][j][x][z],f[i-1][x][y][z]+v[i][j]);
}
}
}
}
}
for (int i=1;i<4;i++)
{
for (int j=1;j<4;j++)
{
for (int l=1;l<4;l++)
{
if ((j<i && i>l) || (j>i && i<l)) maxx=max(maxx,f[n-1][i][j][l]);
}
}
}
printf("%d",maxx);
return 0;
}
其实可以降维但是太懒了