欢迎光临散文网 会员登陆 & 注册

CF竞赛题目讲解_CF478D(DP+滚动数组)

2022-08-20 10:54 作者:Clayton_Zhou  | 我要投稿

https://codeforces.com/problemset/problem/478/D

题意:

给定r个红块,g个绿块,排列要求:1.第i行放i块;     2.每行同色 

问当堆放成最大高度时,有多少种可能的堆放方式 


思路:

首先确定能够放置几行

设红块有r个,绿块有g个,那么放置h行需要(h+1)h/2个

那么r+g>=(h+1)h/2 => 2(r+g)>=(h+1)h => 2(r+g)>h*h

那么有 h=sqrt(2r+2g),然后再找符合条件的h 


状态:dp[i][j]表示前i行用了j个红块的排列方案个数

转移方程:外层循环枚举i表示第i层,内层循环枚举j表示红块使用数 


1. 如果 i<=j,    dp[i][j]=dp[i-1][j]+dp[i-1][j-i],即第i层不用红块和全部用红块的两种决策 

2. 如果 i>j, dp[i][j]=dp[i-1][j], 即第i层只能用绿块


决策合法性:

前i层红块至少用max(i(i+1)/2-g,0)个 

初始状态,dp=0,

如果r>0,dp[1][1]=1;

如果g>0,dp[1][0]=1 

用滚动数组优化 


CF竞赛题目讲解_CF478D(DP+滚动数组)的评论 (共 条)

分享到微博请遵守国家法律