zoukankan      html  css  js  c++  java
  • 嘟!数字三角形 W WW WWW集合!

    哔!数字三角形全体集合!

    数字三角形!到!

    数字三角形W!到!

    数字三角形WW!到!

    数字三角形WWW!到!

    --------------------------------------------------------------------------------------------------------------------------------------------------------

    数字三角形,一个灰常灰常典型的动规题,是一道灰常灰常水的动规题,

    1220 数字三角形

     

     时间限制: 1 s
     空间限制: 128000 KB
     题目等级 : 黄金 Gold
     
    题目描述 Description

    如图所示的数字三角形,从顶部出发,在每一结点可以选择向左走或得向右走,一直走到底层,要求找出一条路径,使路径上的值最大。

    输入描述 Input Description

    第一行是数塔层数N(1<=N<=100)。

    第二行起,按数塔图形,有一个或多个的整数,表示该层节点的值,共有N行。

    输出描述 Output Description

    输出最大值。

    样例输入 Sample Input

    5

    13

    11 8

    12 7 26

    6 14 15 8

    12 7 13 24 11

    样例输出 Sample Output

    86

    话不多说上代码:

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cmath>
    using namespace std;
    int a[110][110]={0},n;
    int main()
    {
    	cin>>n;
    	for (int i=1;i<=n;i++)
    		for (int j=1;j<=i;j++)
    			cin>>a[i][j];
    	for (int i=n-1;i>=1;--i)
    		for (int j=1;j<=i;j++)
    			a[i][j]=max(a[i][j]+a[i+1][j],a[i][j]+a[i+1][j+1]);
    	cout<<a[1][1];
    	return 0;
    }
    --------------------------------------------------------------------------------------------------------------------------------------------------------
    重点说的是后三个转换型的题,我们先跳过 数字三角形W ,先来看数字三角形WW和WWW;
    其实这两道题也是水题,先看题目:

    193 数字三角形WW

     

     时间限制: 1 s
     空间限制: 32000 KB
     题目等级 : 钻石 Diamond
     
     题目描述 Description

    数字三角形必须经过某一个点,使之走的路程和最大

    输入描述 Input Description

    第1行n,表示n行
    第2到n+1行为每个的权值
    程序必须经过n div 2,n div 2这个点

    输出描述 Output Description

    最大值

    样例输入 Sample Input

    2
    1
    1 1

    样例输出 Sample Output

    2

    数据范围及提示 Data Size & Hint

    n <=25

    要求必须经过(n/2,n/2)这个点的话,那我们只需把这个点的值先加上一个较大的数,

    最后只需给结果减去你给它加上的值就好了,水题直接上代码:

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cmath>
    using namespace std;
    int a[110][110]={0},n;
    bool f[110][110]={0};
    int main()
    {
    	cin>>n;
    	for (int i=1;i<=n;i++)
    		for (int j=1;j<=i;j++)
    			{
    				cin>>a[i][j];
    			}
    	a[n/2][n/2]+=5000;
    	for (int i=n-1;i>=1;--i)
    		for (int j=1;j<=i;j++)
    			a[i][j]=max(a[i][j]+a[i+1][j],a[i][j]+a[i+1][j+1]);
    	cout<<a[1][1]-5000;
    	return 0;
    }

    --------------------------------------------------------------------------------------------------------------------------------------------------------

    2198 数字三角形WWW

     

     时间限制: 1 s
     空间限制: 32000 KB
     题目等级 : 钻石 Diamond
      
    题目描述 Description

    数字三角形必须经过某一个点,使之走的路程和最大

    输入描述 Input Description

    第1行n,表示n行 
    第2到n+1行为每个的权值
    第n+2行为两个数x,y表示必须经过的点

    输出描述 Output Description

    最大值

    样例输入 Sample Input

    2
    1
    1 1
    1 1

    样例输出 Sample Output

    2

    数据范围及提示 Data Size & Hint

    n<=25

    这题思路与WW一样一样滴,只是把必走的点变成了(x,y),

    上代码:

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cmath>
    using namespace std;
    int a[110][110]={0},n,x,y;
    bool f[110][110]={0};
    int main()
    {
    	cin>>n;
    	for (int i=1;i<=n;i++)
    		for (int j=1;j<=i;j++)
    				cin>>a[i][j];
    	cin>>x>>y;
    	a[x][y]+=5000;
    	for (int i=n-1;i>=1;--i)
    		for (int j=1;j<=i;j++)
    			a[i][j]=max(a[i][j]+a[i+1][j],a[i][j]+a[i+1][j+1]);
    	cout<<a[1][1]-5000;
    	return 0;
    }
    --------------------------------------------------------------------------------------------------------------------------------------------------------
    到了最重点的题:数字三角形W,这个题一开始我并没有想出较简单做法,后来敬爱的学哥学姐教会了我,因为毕竟我也是个蒟蒻啊...具体做法在代码中解释吧。

    2189 数字三角形W

     

     时间限制: 1 s
     空间限制: 32000 KB
     题目等级 : 黄金 Gold
     
    题目描述 Description

    数字三角形
    要求走到最后mod 100最大

    输入描述 Input Description

    第1行n,表示n行
    第2到n+1行为每个的权值

    输出描述 Output Description

    mod 100最大值

    样例输入 Sample Input

    2
    1
    99 98

    样例输出 Sample Output

    99

    数据范围及提示 Data Size & Hint

    n<=25

    代码:

    //我是用的倒推的思路做的,顺推其实思路一样,转换一下就好,这里只给出倒推得代码
    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    using namespace std;
    int n,a[26][26]={0};
    bool f[26][26][100]={0};
    int main()
    {
    cin>>n;
    for (int i=1;i<=n;i++) //数据的读入
    for (int j=1;j<=i;j++)
    cin>>a[i][j];
    for (int i=1;i<=n;i++) //这一步的代码是为了将最后一排的所有数存下来
    f[n][i][a[n][i]]=true;
    for (int i=n-1;i>=1;--i) //这里是主要过程,思路:将所有的可能性mod100都存下来,
    for (int j=1;j<=i;j++)
    for (int k=0;k<=99;k++)
    {
    if (f[i+1][j][k])
    f[i][j][(k+a[i][j])%100]=true;
    if (f[i+1][j+1][k])
    f[i][j][(k+a[i][j])%100]=true;
    }
    for (int k=99;k>=0;--k) //找出所有可能性中最大的可能,输出,这个题就AC咯、
    if (f[1][1][k])
    {
    cout<<k;
    return 0;
    }
    }

  • 相关阅读:
    chaos —— 混沌
    《菊与刀》original 的阅读
    《菊与刀》original 的阅读
    十六进制(二进制)编辑器
    十六进制(二进制)编辑器
    Hopfield 神经网络及稳态性的证明
    Hopfield 神经网络及稳态性的证明
    OpenGL(一)绘制圆、五角星、正弦曲线
    NYOJ 8 一种排序(comparator排序)
    oc 第五天(内存管理)
  • 原文地址:https://www.cnblogs.com/xiaoqi7/p/5268177.html
Copyright © 2011-2022 走看看