2021.5.22(补)

1.NC 困难的数学题

https://ac.nowcoder.com/acm/contest/16832/C

给定正整数n,将其分解为若干个不小于k的正整数之和,有多少种方案?(顺序不同的划分视为不同的方案)由于答案可能很大,对1e9+7取模。1<=k<=n<=1e6

总结:看着像个背包,然后就成功的跑偏,陷入背包的“旋涡”。后来问了学长,听过学长的讲解之后才发现是如此的简单。还是因为dp做的太少了。

思路:f[i]表示以和为i的集合,属性为方案数。

集合划分:一般是以最后一步为划分依据,这道题也不例外,对于dp[i],如果确定了该某种选择方案的最后一个数记为x,此情况的方案数即为f[i-x],当x==i时,即最后一个数是i,是一种方案。

所以状态划分 x==( k, k+1, k+2, i-1, i)。因为最后一个数 x>=k,所以 i-x<= i-k

状态转移方程 f[i]=f[i-k]+f[i-k-1]+f[i-k-2]…f[1]+1。 这样时间复杂度是o(n^2),不行,需要优化,很容易发现,维护个前缀和就行了。f[i]=sum[i-k]+1。这样就变成了o(n)的时间复杂度。

总结:动态规划三部曲:状态表示,状态划分,状态计算。外加优化。

2.大意:NC 值钱的项链

https://ac.nowcoder.com/acm/contest/16832/F

大意:一条项链有n个位置可以串珠子。这n个珠子形成一个环,也就是说,当n>=2时,对于 1<=1<n,第i个位置和第i+1个位置相邻,同时第i个位置和第n个位置也相邻。现在,每个位置都要从m个备选的珠子中选择一个(对于不同位置,备选珠子不同),每个珠子都有自己的价值和颜色。珠子的颜色可以分成两种:蓝色和红色,1代表红色,0代表蓝色,项链中不能存在两个连续的红色珠子,求把项链穿起来最大价值,如果没有合法方案输出-1。

n*m<=1e6, 0<=val<1e9

思路:看到环直觉就是确定第一个位置,要么红要么蓝,就两种情况,dp两遍就行了。另外题目明确说明n>=2,直觉就是可能需要特判1,果不其然。另外对于每个位置的备选方案,红蓝只需要存一个最大值就行了,如果没有就即为-1。接下来就是dp了。

状态表示f[i,j]表示第i个位置颜色为j的选择方案,属性为最大值。

状态划分,很明显 分为 f[i,1]和f[i,0]。即第i个位置放蓝色还是红色。

对于放蓝色不用考虑前后位置。首先这个位置得有蓝色即

if(a[i][0]!=-1)
{
	if(f[i-1][0]!=-1)f[i][0]=f[i-1][0]+a[i][0];
	if(f[i-1][1]!=-1)f[i][0]=max(f[i][0],f[i-1][1]+a[i][0]);
}
else f[i][0]=-1;

对于放红色的情况,它前一个位置一定不能是红色

if(a[i][1]!=-1&&f[i-1][0]!=-1)f[i][1]=f[i][0]+a[i][1];
else f[i][1]=-1;

对于第一个位置放蓝色的情况,第n个位置不需要确定是蓝色还是红色。
对于第一个位置放红色的情况,第n个位置必须是蓝色。
总结:一般环形的想想看能不能变成线性。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值