POJ 1163 数字三角形

Portal:http://poj.org/problem?id=1163

DP经典题,IOI94考题,在各大OJ上都有

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<set>
 4 #include<cstdio>
 5 #include<cstdlib>
 6 #include<cmath>
 7 using namespace std;
 8 #define FOR(i,j,k) for(int i=j;i<=k;i++)
 9 #define FORD(i,j,k) for(int i=j;i>=k;i--)
10 #define LL long long
11 #define maxn 1010
12 int cost[maxn][maxn],dp[maxn][maxn];
13 int T,n;
14 int main()
15 {
16     cin>>n;
17     FOR(i,1,n)
18         FOR(j,1,i)
19             cin>>cost[i][j];
20     FORD(i,n,1)
21         FOR(j,1,i)
22             dp[i][j]=cost[i][j]+max(dp[i+1][j],dp[i+1][j+1]);
23     cout<<dp[1][1]<<endl;
24 return 0;
25 }

水水的写法

这道题还有加强的版本,增加了数据规模和数据组数,然并卵 如UESTC 1011

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<set>
 4 #include<cstdio>
 5 #include<cstdlib>
 6 #include<cmath>
 7 using namespace std;
 8 #define FOR(i,j,k) for(int i=j;i<=k;i++)
 9 #define FORD(i,j,k) for(int i=j;i>=k;i--)
10 #define LL long long
11 #define maxn 110
12 int cost[maxn][maxn],dp[maxn][maxn];
13 int T,n;
14 int main()
15 {
16 cin>>T;
17 FOR(i,1,T)
18 {
19     cin>>n;
20     FOR(i,1,n)
21         FOR(j,1,i)
22             cin>>cost[i][j];
23     FORD(i,n,1)
24         FOR(j,1,i)
25             dp[i][j]=cost[i][j]+max(dp[i+1][j],dp[i+1][j+1]);
26     cout<<dp[1][1]<<endl;
27     FOR(i,1,n)
28     FOR(j,1,n)
29     {cost[i][j]=0;dp[i][j]=0;}
30 }
31 return 0;
32 }

依然水水的写法

据我理解:dp是建立在各子问题的独立与子问题的最优子结构上的

值得注意的是,这道题的dp有两种写法

dp[i][j]既可以表示以(i,j)为起点的路径长度最大值 【1】

也可以表示以(i,j)为终点的路径长度最大值 【2】

当然都是最大值啦DAZE

如果这题要输出任意一种最长路径的话,用【1】进行DP较优

这是因为路径的直接无回溯输出是由顶向底,所以它要求每个经过点都有确定的后驱,所以用【1】

当然用【2】的话写个简单的回溯取解就好了,有点烦啊。。。

话说这道题的dp决策树似乎是个DAG,说来DAG满足各种dp条件啊,那岂不是只要碰到DAG就可以拿dp乱搞了? ふっふっと

时间: 2024-12-29 23:52:34

POJ 1163 数字三角形的相关文章

POJ 2760: 数字三角形

import java.util.Scanner; public class Main { public static void main(String[] args) { int[][] triNumbers = new int[101][101];//0-100内 int[][] triMaxs = new int[101][101]; Scanner in = new Scanner(System.in); int nrow = in.nextInt();//行数 for(int i=0;

数字三角形-poj

题目要求: 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 在上面的数字三角形中寻找在上面的数字三角形中寻找一条从顶部到底边的路径,使得路径上所经过的数字之和最大.路径上的每一步都只能往左下或右下走.只需要求出这个最大和即可,不必给出具体路径.  三角形的行数大于1小于等于100,数字为 0 - 99 输入格式: 5 //三角形行数.下面是三角形 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 解题思路: 用二维数组存放数字三角形 D[r][j] //表示第i行第j个元素

POJ 3176-Cow Bowling(dp_数字三角形)

Cow Bowling Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit Status Description The cows don't use actual bowling balls when they go bowling. They each take a number (in the range 0..99), though, and line up in a st

POJ 1163 The Triangle

题目链接:http://poj.org/problem?id=1163 The Triangle Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 39022   Accepted: 23430 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 calculat

POJ 1163 The Triangle (简单线性dp)

OJ题目 : click here~~ 题目分析:给一个数字三角形,从最上面一个数字开始,方向只能往左下或者右下,一直到最后一行,求经过的所有数字和的最大值. 搞清楚在输入的数据中,route的方向就行. AC_CODE int num[102][102]; int main(){ int n , i , j , k ; while(cin >> n){ int x[102][102]; for(i = 1;i <= n;i++) for(j = 1;j <= i;j++) sca

POJ_3176_Cow_Bowling(数字三角形)

描述 http://poj.org/problem?id=3176 给出一个三角形,每个点可以走到它下面两个点,将所有经过的点的值加起来,问最大的和是多少. 分析 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using std :: max; 5 6 const int maxn=355; 7 int a[maxn][maxn],f[maxn][maxn]; 8 int n; 9 10 i

poj 1163 The Triangle &amp;poj 3167 Cow Bowling (dp)

链接:poj 1163 题意:输入一个n层的三角形,第i层有i个数,求从第1层到第n层的所有路线中,权值之和最大的路线. 规定:第i层的某个数只能连线走到第i+1层中与它位置相邻的两个数中的一个. 状态方程:f[i][j]=max(f[i-1][j-1],f[i-1][j])+a[i][j]; 1163代码: #include<stdio.h> #include<string.h> int a[105][105],f[105][105]; int max(int a,int b)

数字三角形

数字三角形必须经过某一个点,使之走的路程和最大 输入格式: 第1行n,表示n行 (n<=25), 第2到n+1行为每个的权值,第n+2行为两个数x,y表示必须经过的点 输出格式: 输出最大值 样例1 输入: 2 1 1 1 1 1 输出: 2 //11 月 23 日 2015 #include <stdio.h> int num[26][26];//存储数字三角形的权值 int route[26][2];//记录临时最优路径 int n; int s1,s2;//以特殊点分为上半段和下半

蓝桥杯 算法训练 ALGO-124 数字三角形

算法训练 数字三角形 时间限制:1.0s   内存限制:256.0MB 问题描述 (图3.1-1)示出了一个数字三角形. 请编一个程序计算从顶至底的某处的一条路 径,使该路径所经过的数字的总和最大. ●每一步可沿左斜线向下或右斜线向下走: ●1<三角形行数≤100: ●三角形中的数字为整数0,1,-99: . (图3.1-1) 输入格式 文件中首先读到的是三角形的行数. 接下来描述整个三角形 输出格式 最大总和(整数) 样例输入 573 88 1 02 7 4 44 5 2 6 5 样例输出 3