P1133教主的花园

匿名 (未验证) 提交于 2019-12-03 00:41:02

本题是一道多维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

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!