简单的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])