码迷,mamicode.com
首页 > 其他好文 > 详细

P1133教主的花园

时间:2018-07-15 23:50:32      阅读:260      评论:0      收藏:0      [点我收藏+]

标签:class   数组   二维   高度   namespace   第一课   打开   cpp   位置   

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

其实可以降维但是太懒了

P1133教主的花园

标签:class   数组   二维   高度   namespace   第一课   打开   cpp   位置   

原文地址:https://www.cnblogs.com/LSWorld/p/mutidp1.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!