hdu2084数塔问题

来源:互联网 发布:centos如何安装rpm包 编辑:程序博客网 时间:2024/06/06 01:51

数塔问题

是一个很明显的递推问题,我们可以推出递推式dp[i][j] = max(dp[i+1][j],dp[i+1][j+1)) +a[i][j],我们从下往上递推,所以dp[n][i] = a[n][i](循环位置i n->1 j 1->i),答案很显然是dp[1][1],下面贴上代码。

#include<bits/stdc++.h>using namespace std;typedef long long LL;const int maxn = 100 + 10;int dp[maxn][maxn];int a[maxn][maxn];void init(){    for(int i = 0;i<=100;i++)    {        for(int j = 0;j<=100;j++)        {            a[i][j] = 0;            dp[i][j] = 0;        }    }}void solve(){    int t;    scanf("%d",&t);    while(t--)    {        init();        int n;        scanf("%d",&n);        for(int i = 1;i<=n;i++)        {            for(int j = 1;j<=i;j++)            {                scanf("%d",&a[i][j]);            }        }        for(int i = 1;i<=n;i++)        {            dp[n][i] = a[n][i];        }        for(int i =n-1;i>=1;i--)        {            for(int j = 1;j<=i;j++)            {                dp[i][j] = max(dp[i+1][j],dp[i+1][j+1]) + a[i][j];            }        }        printf("%d\n",dp[1][1]);    }}int main(){    solve();}
import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.util.StringTokenizer;import java.util.concurrent.LinkedBlockingDeque;import java.util.Arrays;import java.util.Collections;import java.util.Comparator;import java.util.HashMap;import java.util.HashSet;import java.util.LinkedList;import java.util.Queue;import java.util.Scanner;import java.util.Stack;import java.lang.Math;public class Main{    Scanner cin = new Scanner(new BufferedInputStream(System.in));    int[][] a = new int[100+10][100+10];    int[][] dp = new int[100+10][100+10];    void init()    {        for(int i = 0;i<=110;i++)        {            for(int j= 0;j<=110;j++)            {                a[i][j] = 0;                dp[i][j] = 0;            }         }    }    void solve()    {        int t;        t = cin.nextInt();        while(t!=0)        {            t--;            int n;            n = cin.nextInt();            for(int i = 1;i<=n;i++)            {                for(int j= 1;j<=i;j++)                {                    a[i][j] = cin.nextInt();                }            }            for(int i = 1;i<=n;i++)            {                dp[n][i] = a[n][i];            }            for(int i = n-1;i>=1;i--)            {                for(int j = 1;j<=i;j++)                {                    dp[i][j] =Math.max(dp[i+1][j+1], dp[i+1][j]) + a[i][j];                }            }            System.out.println(dp[1][1]);        }    }    public  static void main(String[] args)    {        new Main().solve();    }}
0 0
原创粉丝点击