POJ 1163 The Triangle(三种搜索方式)

                                                       The Triangle

Description

7

3 8

8 1 0

2 7 4 4

4 5 2 6 5

(Figure 1)

Figure 1 shows a number triangle. Write a program that calculates the highest sum of numbers passed on a route that starts at the top and ends somewhere on the base. Each step can go either diagonally down to the left or diagonally down to the right.

Input

Your program is to read from standard input. The first line contains one integer N: the number of rows in the triangle. The following N lines describe the data of the triangle. The number of rows in the triangle is > 1 but <= 100. The numbers in the triangle,
all integers, are between 0 and 99.

Output

Your program is to write to standard output. The highest sum is written as an integer.

Sample Input

5

7

3 8

8 1 0

2 7 4 4

4 5 2 6 5

Sample Output

30

题意:给定一个三角形的数字表,求出定点到达最低点的最长的路(点上的值代表其长度)。

解题思路:这是个DP题,从下往上搜,一个点的要么从左边上来,要么从右边上来,所以每次将到达改点的最大值记录下来,状态转换方程为dp[i][j]=max(dp[i+1][j],dp[i+1][j+1])+dp[i][j];

最终输出dp[0][0]即为所求。

复杂度分析: 时间复杂度:o((n)^2)

空间复杂度:o(n^2)

 从上往下搜:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
int main()
{
    int n;
    while(scanf("%d",&n)==1)
    {
        int dp[n][n];
        for(int i=0;i<n;i++)
            for(int j=0;j<=i;j++) scanf("%d",&dp[i][j]);
        for(int i=1;i<n;i++){
            dp[i][0] += dp[i-1][0];
            dp[i][i] +=dp[i-1][i-1];
        }
        for(int i=2;i<n;i++)
            for(int j=1;j<=i-1;j++)
            dp[i][j]=max(dp[i-1][j],dp[i-1][j-1])+dp[i][j];
        for(int i=1;i<n;i++) dp[n-1][0]=max(dp[n-1][0],dp[n-1][i]);
        cout << dp[n-1][0] << endl;
    }
    return 0;
}

 或者:从下往上搜

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
int main()
{
    int n;
    while(scanf("%d",&n)==1)
    {
        int dp[n][n];
        for(int i=0;i<n;i++)
          for(int j=0;j<=i;j++) cin>>dp[i][j];
        for(int i=n-2;i>=0;i--)
            for(int j=0;j<=i;j++)
             dp[i][j]=max(dp[i+1][j],dp[i+1][j+1])+dp[i][j];
        cout << dp[0][0] << endl;
    }
    return 0;
}

 或者记忆化搜索:

 #include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;

 const int N=105;
 int dp[N][N],a[N][N];
 int dps(int x,int y){
    int L,R;
    if(dp[x][y]>=0) return dp[x][y];
    L=dps(x+1,y);
    R=dps(x+1,y+1);
    return dp[x][y]=max(L,R)+a[x][y];
 }
 int main()
{
    int n;
    while(scanf("%d",&n)==1)
    {
        memset(dp,-1,sizeof(dp));
        for(int i=0;i<n;i++)
            for(int j=0;j<=i;j++)
            scanf("%d",&a[i][j]);
        for(int i=0;i<n;i++) dp[n-1][i]=a[n-1][i];
        dps(0,0);
        cout << dp[0][0] << endl;
    }
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-06 11:35:29

POJ 1163 The Triangle(三种搜索方式)的相关文章

MyEclipse中web服务器的三种配置方式

初学Javaweb开发的人们都会遇到一个问题,就是服务器环境的搭建配置问题.下面介绍三种服务器的搭建方式. 直接修改server.xml文件 当你写了一个web应用程序(jsp/servlet),想通过浏览器直接去访问这个页面,需要在Tomcat中配置相关路径: 找到Tomcat下conf目录,你会看到有个server.xml,即服务器配置文件.用文本编译器打开,拉到Host标签,在它结束前加上我们的应用程序路径: <Context path="/HelloWeb" docBas

jenkins介绍部署及三种构建方式配置

[隐藏] 1前言 1.1jenkins介绍 1.2jenkins好处 1.3我的jenkins实践 1.4jenkins使用前提 2jenkins部署 2.1下面内容介绍 2.2环境介绍 2.3jenkins安装 3插件安装 3.1手动下载jenkins插件 4Jenkins密钥配置 5jenkins触发式构建 6jenkins参数化构建 7jenkins定时构建 8Jenkins用户权限设置 8.1新创建一个用户 8.2用户权限设置 1.前言 1.1.jenkins介绍 jenkins是基于j

Spring IOC 中三种注入方式

项目错误知识点记录 正文 最近在项目的时候,用到Spring框架,Spring框架提供了一种IOC的自动注入功能,可以很轻松的帮助我们创建一个Bean,这样就省的我们四处写new Object()这样的代码了.IOC提供了三种注入方式,接口注入,set方法注入以及构造器注入,三种注入方式使用起来都很easy,具体的使用方法网上都有很多,大家可以自行搜索百度... 那天当我使用接口注入的时候,发现IDEA给我一个警告(以前也有这样的警告,只不过我没太注意),看了看是让我采用构造器注入方式.这就让我

同一个关键字,三种匹配方式投放的问题

同一个关键字,用3种匹配方式投放,调整出价的时候应该怎么调整. 一般情况下,这三种匹配方式指的是精确匹配,词组匹配和广泛匹配.为什么要有这三种匹配方式? 个人感觉原因就是你发现有一个词是自己产品的很准确的关键词,当你添加到账户之后,运用某种匹配方式,如词组匹配,运行一段时间,发现展示量很少,CTR很低,这时候,你会考虑是否要更改匹配方式,如更改成广泛匹配,但更改的同时你不知道会带来怎么样的后果,所以就直接在原账户里添加一个广泛匹配和精确匹配(即完全匹配),如[A],"A",A然后从搜索

NBIoT三种部署方式【转】

转自:https://472880.kuaizhan.com/89/34/p441944286fccf2 本文作者:吴老司撩通信 本文来源:EETOP NB-IoT支持在频段内(In-Band).保护频段(Guard Band)以及独立(Stand-alone)共三种部署方式. 本篇介绍NB的三种部署方式(Operation Modes). 那个谁,你到底叫啥名 关于Operation Modes的翻译问题,列举下:工作模式.工作方式.操作模式.部署方式.部署场景.运行模式……这是非要凑成七个葫

【网络爬虫的三种解析方式】 -- 2019-08-08 18:01:21

原文: http://106.13.73.98/__/132/ 三种解析方式 正则解析 Xpath解析 BeautifulSoup解析 本文将详细为大家讲解三种聚焦爬虫中的数据解析方式. requests模块可实现数据爬取的流程 指定url 基于requests模块发起请求 获取响应对象中的数据 进行持久化存储 ???????其实,在上述流程中还需要较为重要的一步,就是在持久化存储之前需要进行指定数据解析.因为,在大多数情况下,我们都是指定去使用聚焦爬虫,也就是爬取页面中指定部分的数据值,而不是

CSS的三种定位方式介绍(转载)

在CSS中一共有N种定位方式,其中,static ,relative,absolute三种方式是最基本最常用的三种定位方式.他们的基 本介绍如下. static默认定位方式relative相对定位,相对于原来的位置,但是原来的位置仍然保留absolute定位,相对于最近的非标准刘定位,原来的位置消失,被后边的位置所顶替 下面先演示相对定位的案例 [html] view plain copyprint? <!DOCTYPE html> <html> <head> <

1、打印二进制机器码,程序内存分析,大端序小端序,指针数组,数组指针,数组的三种访问方式,typedef,#if-0-#endif,求数组大小,括号表达式

 1.打印二进制机器码(分别表示32位的和64位的) #include <stdio.h> /*按照8位的长度打印一个数值*/ void dis8bit(char val) { int bit = 8; while(bit--) { if(1<<bit&val){ printf("1"); } else { printf("0"); } if(!(bit%4)) printf(" "); } putchar(1

SQL Server 中的三种分页方式

USE tempdb GO SET NOCOUNT ON --创建表结构 IF OBJECT_ID(N'ClassB', N'U') IS NOT NULL DROP TABLE ClassB GO CREATE TABLE ClassB(ID INT PRIMARY KEY, Name VARCHAR(16), CreateDate DATETIME, AID INT, Status INT) CREATE INDEX IDX_CreateDate ON ClassB(CreateDate)