DP_NYOJ18/NYOJ171

NYOJ18http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=18

数字三角形问题, 要求从第一个点开始,每次只能走右下或者左下的点,要求路过的点的数据之和最大

/*************************************************************
 * > File Name: 018_数字三角形.cpp
 * > Author: weigang
 * > Mail: w_wg@qq.com 
 * > Created Time: 2018年05月22日 星期二 16时01分54秒
 *************************************************************/

#include<bits/stdc++.h>
using namespace std;
int a[105][105],b[105][105];
int main(void)
{
    int n,i,j;
    scanf("%d",&n);
    for(i = 0; i < n; ++i)
        for(j = 0; j <= i; ++j)
            scanf("%d",&a[i][j]);
    for(j = 0; j < n; j++)
        b[n][j] = a[n][j];
    for(i = n-1; i >= 0; i--)
        for(j = 0; j < n; j++)
            b[i][j] = a[i][j] + max(b[i+1][j],b[i+1][j+1]);
    printf("%d\n",b[0][0]);

    return 0;
}

NYOJ171 http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=171

题目跟上面的差不多,要求从第一个点开始到最右下角的点,每次只能右移或下移,要求经过的点之和最大

/*************************************************************
 * > File Name: 171_聪明的kk.cpp
 * > Author: weigang
 * > Mail: w_wg@qq.com 
 * > Created Time: 2018年05月23日 星期三 15时16分38秒
 *************************************************************/

#include<bits/stdc++.h>
using namespace std;
int a[25][25],t[25][25];
int main(void)
{
    int m,n,i,j,my_max = 0;
    cin >> n >> m;
    for(i = 0; i < n; ++i)
        for(j = 0; j < m; ++j)
            scanf("%d",&a[i][j]);
    my_max = t[0][0] = a[0][0];
    for(i = 1; i < m; ++i)
    {
        t[0][i] = t[0][i-1] + a[0][i];
        if(t[0][i] > my_max) 
            my_max = t[0][i];
    }
    for(j = 1; j < n; ++j)
    {
        t[j][0] = t[j-1][0] + a[j][0];
        if(t[j][0] > my_max)
            my_max = t[j][0];
    }
    for(i = 1; i < n; ++i)
        for(j = 1; j < m; ++j)
        {
            t[i][j] = a[i][j] + max(t[i-1][j],t[i][j-1]);
            if(t[i][j] > my_max) 
                my_max = t[i][j];
        }
    printf("%d\n",my_max);

    return 0;
} 

 

posted @ 2018-05-23 16:32  凉菜花生小酒  阅读(84)  评论(0)    收藏  举报