简单的dp - A diagrams

 

 

 

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])


posted @ 2019-04-05 16:36  Nlifea  阅读(145)  评论(0编辑  收藏  举报