zoukankan      html  css  js  c++  java
  • 简单的dp

    A diagrams

    链接:https://ac.nowcoder.com/acm/contest/554/A
    来源:牛客网

    题目描述

    小虎刚刚上了幼儿园,老师让他做一个家庭作业:首先画3个格子,第二行有2个格子,第三行有1个格子。每行的格子从左到右可以放棋子,但要求除第一行外,每行放的棋子数不能超过上一行的棋子。玩了一会儿,小虎问大哥大虎:这个作业有很多种摆放法,我想都找到,但我不知道有多少中方案,你能帮助我么?
    大虎是学校信息学集训队的,立刻想到用计算机来解决这个问题,并很快有了解答:13。第二天他把问题拿到了学校,并说如果第一行有N个格子,第二行有N-1个格子,…,第N行有1个格子,怎么办?现在请你一块来帮助他解决这个难题。
    数据范围
    30%数据:1≤N≤12
    50%数据:1≤N≤30
    100%数据:1≤N≤100

    输入描述:

    仅一行,一个正整数N。

    输出描述:

    一行,方案总数。

    思路 :

    我们用 dp[i][j] 代替 第 i 行 有 j 个位置的时候的方案数

    假设你在第 i 行 第 j 个位置 那么 dp[i][j] = dp[i-1][j] + dp[i-1][j-2] + … … + dp[i-1][1]
    如果此时 i = j 则 dp[i][j] = dp[i-1][j-1] + dp[i-1][j-2] + … … + dp[i-1][1]

    因为中途会爆出long long 型的范围因此用了python来写

    code :

    dp = []
    
    for i in range(101):
        dp.append([])
        for j in range(101) :
            dp[i].append(0)
    
    dp[1][1] = 1
    dp[2][1] = 2
    dp[2][2] = 4
    for i in range(3 ,100 + 1) :
        for j in range(1 ,i+1):
            if i == j  :
                dp[i][j] = dp[i-1][j-1] + 1
            else:
                dp[i][j] = dp[i-1][j] + 1
        for j in range(1 ,i+1):
            dp[i][j] = dp[i][j-1] + dp[i][j]
    
    t = eval(input())
    
    print(dp[t][t])
    
    
    
  • 相关阅读:
    第03组 Alpha冲刺(3/6)
    第03组 Alpha冲刺(2/6)
    第03组 Alpha冲刺(1/6)
    团队项目-选题报告
    第3组 团队展示
    福大软工 · BETA 版冲刺前准备(团队)
    Alpha 事后诸葛亮
    Alpha冲刺
    Alpha冲刺-(9/10)
    Alpha冲刺
  • 原文地址:https://www.cnblogs.com/Nlifea/p/11745918.html
Copyright © 2011-2022 走看看