P1133 教主的花园

题目地址

这是一道DP的题目 就是情况比较多
一共有四种情况
第一点为10 且上升 start=0 angle=1
第一点为20 且上升start=1 angle=1
第一点为20 且下降start=1 angle=-1
第一点为30 且下降start=2 angle=-1
分这四种情况DP四次 取最优结果就行了

初始化dp为-1
第一行dp[0][start]=input[0][start];

dp[i][j]=max(上个可选点集合)+input[i][j];
上个可选点的位置由当前位置j 和当前的方向angle决定
如果上个点不可到达 就dp[i][j]=-1;
每做完一行的dp对angle取个反表示方向变了

最后计算结果的时候要考虑start angle排除掉不可能的点
然后取最大值

做完4次DP取4次DP最大值就是结果

#include <stdio.h>

const int Type=3;

void init(int** dp,int n)
{
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<Type;j++)
        {
            dp[i][j]=-1;
        }
    }
}

/**
 *angle 第一个数 1递增 -1递减
 */
int dpFunc(int** input,int** dp,int n,int start,int angle){
    init(dp,n);

    int i,j,k;
    dp[0][start]=input[0][start];

    int tmpAngle=angle;
    int max;

    for(i=1;i<n;i++)
    {
        for(j=0;j<Type;j++)
        {
            k=j-tmpAngle;
            max=-1;
            while (k>=0&&k<Type)
            {
                if(dp[i-1][k]>max)
                {
                    max=dp[i-1][k];
                }
                k-=tmpAngle;
            }

            if(max>0)
            {
                dp[i][j]=max+input[i][j];
            }
            
        }
        //这个点上升下一个点就下降
        tmpAngle=-tmpAngle;
    }

    k=start+angle;
    max=-1;
    while (k>=0&&k<Type)
    {
        if(dp[n-1][k]>max)
        {
            max=dp[n-1][k];
        }
        k+=angle;
    }

    
    return max;
}

int main(){
    int n;
    int i;
    scanf("%d",&n);
    int** input=new int*[n];
    int** dp=new int*[n];
    for(i=0;i<n;i++)
    {
        input[i]=new int[Type];
        dp[i]=new int[Type];
        scanf("%d %d %d",&input[i][0],&input[i][1],&input[i][2]);
    }

    int start=0,angle=1;
    int max=dpFunc(input,dp,n,start,angle);

    start=1;
    int tmp=dpFunc(input,dp,n,start,angle);
    if(tmp>max)
    {
        max=tmp;
    }

    angle=-1;
    tmp=dpFunc(input,dp,n,start,angle);
    if(tmp>max)
    {
        max=tmp;
    }

    start=2;
    tmp=dpFunc(input,dp,n,start,angle);
    if(tmp>max)
    {
        max=tmp;
    }

    printf("%d\n",max);


    for(i=0;i<n;i++)
    {
        delete input[i];
        delete dp[i];
    }
    delete input;
    delete dp;
    return 0;
}

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 51. 加法 不使用+、-,计算两数字之和 52. 至少有K个重复字符的最长子串 找到给定字符串(由小写字符组成)...
    毒死预言家的女巫阅读 737评论 0 0
  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 7,199评论 0 17
  • 第一部分 初识Python语言 第1章 程序设计基本方法 1.1 计算机的概念 计算机是根据指令操作数据的设备,具...
    不脱发的程序员阅读 1,196评论 0 1
  • 目录 1 左神部分集锦 2 Leetcode前150题 3 牛客网剑指offer 4 JavaG 5 题目中的...
    小小千千阅读 1,332评论 0 0
  • 1.链表 1.实现一个单向链表 2.找出链表相交节点,假设均没有环 3.判断链表是否有环思路:使用快慢两个指针,当...
    X1028阅读 724评论 0 0

友情链接更多精彩内容