本题是一道多维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; }
其实可以降维但是太懒了
原文:https://www.cnblogs.com/LSWorld/p/mutidp1.html