第十一周小结

  这周没看新的内容,因为之前学习新知识的时候做题量没跟上,所以总觉得在算法的理解上差了一点。于是这几天暂时缓了缓往下的学习,想着把之前看的知识沉淀沉淀,集中精力做了些题。在此整理几道不错的题目。

UVA11021 Tribles麻球繁衍
题意:一开始有k种生物,这种生物只能活1天,死的时候有pi 的概率产生i只这种生物,询问m天内所有生物都死的概率。

题解:有种做数学题的感觉,刚好这学期开了概率统计课,正好用上。设状态f[i]表示一个麻球i天内死绝的概率,因为麻球是相互独立的,所以n个麻球在i天内死亡的概率是f [ i ] 的 n 次方。转移时考虑这个麻球第一天繁衍多少个,它们在接下来的i−1天内就没了。可以推得转移方程为,f [ i ] = ∑ (p [ j ] *(f [ i − 1 ] 的 j 次方))(0<=j<=k-1)。考虑到开始有k只麻球,那么fm的k次方即为所求。

#include<bits/stdc++.h>
using namespace std;
int k,n,m,d;
double p[1005],f[1005];
int main()
{
	cin>>d;
	for(int t=1;t<=d;t++)
	{   cin>>n>>k>>m;
		for(int i=0;i<n;i++)
		  cin>>p[i];
		f[1]=p[0];
		f[0]=0;
		for(int i=2;i<=m;i++)
		{   f[i]=0;
			for(int j=0;j<n;j++)
			{ f[i]+=p[j]*pow(f[i-1],j);}
		}

		printf("Case #%d: %.7lf\n",t,pow(f[m],k));
	}
	return 0;
}

NC210487 食堂
题意:一个长度为n的队伍,人一开始在m的位置。求食堂关门前,人排在队伍前k位的概率。

题解:
设f[i][j]表示i个人排队,人排在第j个位置时达到目标状态的概率。
若 j==1,f[i][1]=p1 * f[i][1]+p2 * f[i][i]+p4;
若2<=j<=k,f[i][j]=p1 * f[i][j]+p2 * f[i][j-1]+p3 * f[i-1][j-1]+p4;
若k<j<=i, f[i][j]=p1 * f[i][j]+p2 * f [i][j-1]+p3 * f [i-1][j-1];
求得f[n][m]即为结果。

P2704 [NOI2001] 炮兵阵地
题意:给出部署规则,求将军们如何部署炮兵部队,可以在防止误伤的前提下,在整个地图区域内最多的摆放多少我军的炮兵部队。

题解:
先推出状态转移方程,dp[i][j][k]表示当前状态是 j,上一行的状态是 i,当前考虑到了第 k 行:dp[i][j][k]=max(dp[i][j][k],dp[p][i][k-1]+Sum[j]); 这里 p 表示上上行的状态,Sum[j] 表示当前状态 j 里面包含几个 1。这题需要注意的是压缩空间,在看了几篇讲解的题解后,积累了几种方法,感觉很实用。一是可以采用滚动数组的方式,减少第一维的空间。或者分析题目,发现如果我们将合法状态输出,最多会有 60 个,所以可以直接压缩后两位状态到 60,这样就可以a了。

下周再接再厉!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值