2018.01.01(数字三角形,最长上升子序列等)

2017.12.24

 简单的动态规划

1.数字三角形(算法引入)

题目描述:下图所示是一个数字三角形,其中三角形中的数值为正整数,现规定从最顶层往下走到最底层,每一步可沿左斜线向下或右斜线向下走。设三角形有n层,编程计算出从顶层到底层的一条路径,使得该路径上的和最大,输出最大值。(n<=100)

思路&&代码(搜索回溯):

#include <stdio.h>

#include <math.h>

#include <string.h>

int map[101][101],n;

int count=0,ans=-20180101;

void search(int x,int y){

  count+=map[x][y];

  if(x==n){

    if(count>ans)ans=count;

  }

  else{

  search(x+1,y+1);

  search(x+1,y);

  }

  count-=map[x][y];

}

int main(){

  scanf("%d",&n);

  int i,j;

  for(i=1;i<=n;i++){

    for(j=1;j<=i;j++){

      scanf("%d",&map[i][j]);

    }

  }

  search(1,1);

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

  return 0;

}

思路&&代码(分治法):

#include <stdio.h>

#include <math.h>

#include <string.h>

int n,map[101][101];

int fenzhi(int x,int y){

  if(x==n)return map[x][y];

  int zi1,zi2,_max;

  zi1=fenzhi(x+1,y);

  zi2=fenzhi(x+1,y+1);

  if(zi1<=zi2)_max=zi2;

  else           _max=zi1;

  return _max+map[x][y];

}

int main(){

  scanf("%d",&n);

  int i,j;

  for(i=1;i<=n;i++){

    for(j=1;j<=i;j++){

      scanf("%d",&map[i][j]);

    }

  }

  printf("%d",fenzhi(1,1));

  return 0;

}

思路&&代码(记忆化):

#include <stdio.h>

#include <math.h>

#include <string.h>

int map[101][101],book[101][101];

int n;

int max(int x,int y){

  if(y>x)

    return y;

  else

    return x;

}

int search(int r,int c){

  int ans;

  if (r==n) return map[r][c];

  if (book[r+1][c]==-1)

    book[r+1][c]=search(r+1,c);

  if (book[r+1][c+1]==-1)

    book[r+1][c+1]=search(r+1,c+1);

  ans=max(book[r+1][c],book[r+1][c+1])+book[r][c];

  return ans;

}

int main(){

  scanf("%d",&n);

  int i,j;

  for(i=1;i<=n;i++){

    for(j=1;j<=i;j++){

      scanf("%d",&map[i][j]);

      book[i][j]=-1;

    }

  }

  printf("%d",search(1,1));

  return 0;

}

思路&&代码(动态规划):

#include <stdio.h>

#include <math.h>

#include <string.h>

int map[101][101],book[101][101];

int max(int x,int y){

  if(x>y)return x;

  else   return y;

}

int main(){

  int n;

  scanf("%d",&n);

  int i,j;

  for(i=1;i<=n;i++){

    for(j=1;j<=i;j++){

      scanf("%d",&map[i][j]);

    }

  }

  for(j=1;j<=n;j++)

    book[n][j]=map[n][j];

  for(i=n-1;i>=1;i--)

    for(j=1;j<=i;j++)

      book[i][j]=max(book[i+1][j+1],book[i+1][j])+map[i][j];

       printf("%d",book[1][1]);

  return 0;

}

2.最长上升子序列(老师别急,我还没有做完,做完就会补上的)

思路:

核心代码:

状态:

原文地址:https://www.cnblogs.com/yzyl-Leo-wey/p/8167768.html

时间: 2024-07-31 05:15:01

2018.01.01(数字三角形,最长上升子序列等)的相关文章

最长公共子序列(LCS)问题

最长公共子串(Longest Common Substirng)和最长公共子序列(Longest Common Subsequence,LCS)的区别为:子串是串的一个连续的部分,子序列则是从不改变序列的顺序,而从序列中去掉任意的元素而获得新的序列:也就是说,子串中字符的位置必须是连续的,子序列则可以不必连续. 1.序列str1和序列str2 ·长度分别为m和n: ·创建1个二维数组L[m.n]: ·初始化L数组内容为0 ·m和n分别从0开始,m++,n++循环: - 如果str1[m] ==

动态规划求两个序列的最长公共子序列

摘录:http://blog.chinaunix.net/uid-26548237-id-3374211.html 1.序列str1和序列str2 ·长度分别为m和n: ·创建1个二维数组L[m.n]: ·初始化L数组内容为0 ·m和n分别从0开始,m++,n++循环: - 如果str1[m] == str2[n],则L[m,n] = L[m - 1, n -1] + 1: - 如果str1[m] != str2[n],则L[m,n] = max{L[m,n - 1],L[m - 1, n]}

最长上升子序列输出序列贪心做法

之前做过的最长上升子序列的题只是不需要输出这个序列http://www.cnblogs.com/Scale-the-heights/p/4333346.html 做法就是从左到右扫一遍,可以参见http://blog.csdn.net/shuangde800/article/details/7474903 要输出路径其实也很简单,就开个数组f[]把所有数字在最长上升子序列中第一次出现的位置记录下来,然后逆序遍历,比如我们找到最长上升子序列的长度为n,则我们从后往前找到曾经在最长上升子序列中位置为

百练2757:最长上升子序列

描述 一个数的序列bi,当b1 < b2 < ... < bS的时候,我们称这个序列是上升的.对于给定的一个序列(a1, a2, ..., aN),我们可以得到一些上升的子序列(ai1, ai2, ..., aiK),这里1 <= i1 < i2 < ... < iK <= N.比如,对于序列(1, 7, 3, 5, 9, 4, 8),有它的一些上升子序列,如(1, 7), (3, 4, 8)等等.这些子序列中最长的长度是4,比如子序列(1, 3, 5, 8

动态规划的设计思想与实例(最大子段和、最长公共子序列、0-1背包、编辑距离)

动态规划算法与分治法类似,其基本思想是将总问题分解成若干个子问题,先求解子问题,再结合这些子问题的解得到原问题的解.与分治法不同的是,动态规划求解的问题经分解得到的子问题往往不是相互独立的. 基本思想: 将总问题分解成多个子问题(子问题也可以继续分解,直到无法分解),计算子问题,用一个表保存已解决的子问题的答案,算完子问题后回到总问题时从表中寻找已求得的答案,根据要求挑选最优解,加上总问题的里的具体变化再存入表中 设计步骤: 1.找出最优解的性质,并刻画其结构特征 根据具体问题找出其结构的特点,

[动态规划]数字三角形

动态规划一直是一个很头疼的问题啊. 最近在看这方面的东西,记录一下刘汝佳书里的动态规划章节里的数字三角形题目. 这道题很基础,但总结的三个动态规划很清晰. 有一个由非负整数组成的三角形,第一行只有一个数,除了最下行之外每个数的左下方和右下方各有一个数,形如: 1 3 2 4 10 1 4 3 2 20 每个结点都可到它左右子结点,例如3可以到4也可以到10. 从第一行开始每次可以往左下或右下走一格,直到走到最下,把沿途结点的值相加,如何走才能得到最大值. 如果遍历的话,n层会有2的n次方种可能性

Bentley.STAAD.RCDC.V8i.04.01.01.03 1CD

1.Bentley Multiframe Advanced V8i SS3 17.00.02.10 Win32_64 1CDBentley Multiframe Advanced V8i SS3 17.00.02.10 Win32_64 1CD Multiframe的分析和设计工具给你一个非常强大和灵活的创建.分析和研究结果的结构的手段.Multiframe唯一的一款功能之间使用VBA自动化的结构分析程序.使用自动化,你可... 2.Bentley Utilities Designer V8i

动态规划--数字三角形问题

1. 问题描述 有一个像这样的数字三角形: 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 从顶点开始,每个数字向下层走只能有左下和右下两个方向,求出到达最后一行时最大的路径之和. Input 第1 行是数字三角形的行数n,1<= n <=100. 接下来n行是数字三角形各行中的数字.所有数字在0---99之间. 比如Input是: 5 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 则output是30. 2. 问题求解 这是一个典型的动态规划求解问题,因为它符合动态

『嗨威说』算法设计与分析 - PTA 数字三角形 / 最大子段和 / 编辑距离问题(第三章上机实践报告)

本文索引目录: 一.PTA实验报告题1 : 数字三角形 1.1 实践题目 1.2 问题描述 1.3 算法描述 1.4 算法时间及空间复杂度分析 二.PTA实验报告题2 : 最大子段和 2.1 实践题目 2.2 问题描述 2.3 算法描述 2.4 算法时间及空间复杂度分析 三.PTA实验报告题3 : 编辑距离问题 3.1 实践题目 3.2 问题描述 3.3 算法描述 3.4 算法时间及空间复杂度分析 四.实验心得体会(实践收获及疑惑) 一.PTA实验报告题1 : 数字三角形 1.1 实践题目: 1