SP1026 FAVDICE - Favorite Dice

Label

期望DP经典例题

Description

一个n面的骰子,求期望掷几次能使得每一面(每一种点数)都被掷到。

数据范围:n≤1000n\leq 1000n1000,共t(t≤1000)t(t\leq 1000)t(t1000)组数据。

Solution
一种正确但不可行的想法

一开始想着设dp[i][j]dp[i][j]dp[i][j]为投掷了iii次骰子后扔到过jjj个不同面所经过次数的期望,那么这个转移式还是比较好想的:

dp[i][j]=n−(j−1)ndp[i−1][j−1]+jndp[i−1][j](dp[1][1]=1)dp[i][j]=\frac{n-(j-1)}{n}dp[i-1][j-1]+\frac{j}{n}dp[i-1][j](dp[1][1]=1)dp[i][j]=nn(j1)dp[i1][j1]+njdp[i1][j](dp[1][1]=1)

ans=∑i=n∞dp[i][n]ans=\sum_{i=n}^{\infty}dp[i][n]ans=i=ndp[i][n]

dp[i][j]dp[i][j]dp[i][j]由两种情况转移而来:1、dp[i−1][j]dp[i-1][j]dp[i1][j]:扔了一次骰子还是已出现过的jjj面中的一种,p=jnp=\frac{j}{n}p=nj;2、dp[i−1][j−1]dp[i-1][j-1]dp[i1][j1]:扔了一次骰子不是已出现过的j−1j-1j1面中的一种,p=n−(j−1)np=\frac{n-(j-1)}{n}p=nn(j1)

但是,这种正向推导的方法有一种显然的问题:理论上存在扔无限次骰子而始终无法使得每一面都被掷到的可能性,故此答案没法统计(ansansans收敛于何处实在难求),故我们考虑不依赖于步数的新状态。

正推?

dp[i]dp[i]dp[i]表示恰好投出iii种不同点数的期望投掷次数,初始状态为dp[1]=1dp[1]=1dp[1]=1,问题来了:dp[i]dp[i]dp[i]由何转移得到?应由dp[i−1]dp[i-1]dp[i1]dp[i]dp[i]dp[i]。到了这里,dp[i−1]dp[i-1]dp[i1]dp[i]dp[i]dp[i]的概率为n−i+1n\frac{n-i+1}{n}nni+1dp[i]dp[i]dp[i]dp[i]dp[i]dp[i]的概率为in\frac{i}{n}ni,概率和不为1,不可行。

逆推

dp[i]dp[i]dp[i]表示当前已投出过iii种不同点数后投掷的期望次数,那么考虑在f[i]f[i]f[i]状态下投掷一次骰子,显然有in\frac{i}{n}ni的概率又扔到原有的iii面骰子,f[i]f[i]f[i]转移到f[i]f[i]f[i],有n−in\frac{n-i}{n}nni的概率扔到原来没扔到的n−in-ini面骰子,f[i]f[i]f[i]转移到f[i+1]f[i+1]f[i+1],所以:

dp[i]=in(dp[i]+1)+n−in(dp[i+1]+1)dp[i]=\frac{i}{n}(dp[i]+1)+\frac{n-i}{n}(dp[i+1]+1)dp[i]=ni(dp[i]+1)+nni(dp[i+1]+1)

其中,dp[n]=0dp[n]=0dp[n]=0

化为标准递归公式的形式,即为:dp[i]=dp[i+1]+nn−idp[i]=dp[i+1]+\frac{n}{n-i}dp[i]=dp[i+1]+nin

(别忘了转移的时候我们扔了一次骰子!)

Code
#include<cstdio>
#include<iostream>
#define ri register int
using namespace std;

const int MAXN=1020;
int t,n;
double dp[MAXN],ans;

int main()
{
	scanf("%d",&t);
	for(ri opt=1;opt<=t;opt++)
	{
		scanf("%d",&n);
		dp[n]=0;
		for(ri i=n-1;i>=0;i--)
			dp[i]=dp[i+1]+(double)n/(double)(n-i);
		printf("%.2f\n",dp[0]);
	}	
	return 0;
}
### Mask R-CNN 中 Dice Loss 的实现 Dice Loss 是一种常用于图像分割任务中的损失函数,尤其适用于目标区域较小的情况。它通过计算预测掩码和真实掩码之间的相似度来衡量模型性能。在 Mask R-CNN 中,通常会结合交叉熵损失 (Cross-Entropy Loss) 和 Dice Loss 来提高模型的鲁棒性和精度。 以下是关于如何在 Mask R-CNN 中实现 Dice Loss 的具体方法: #### 1. 定义 Dice Loss 函数 Dice Loss 可以定义如下: \[ DICE\_LOSS = 1 - \frac{2 * |A \cap B|}{|A| + |B|} \] 其中 \( A \) 表示真实的掩码,\( B \) 表示预测的掩码[^2]。 下面是基于 PyTorch 实现的一个简单版本的 Dice Loss 函数: ```python import torch import torch.nn as nn def dice_loss(pred, target, smooth=1e-7): pred = pred.contiguous() target = target.contiguous() intersection = (pred * target).sum(dim=(2, 3)) union = pred.sum(dim=(2, 3)) + target.sum(dim=(2, 3)) loss = 1 - ((2.0 * intersection + smooth) / (union + smooth)).mean() return loss ``` 此代码片段实现了基本的 Dice Loss 计算逻辑,并允许加入平滑项 `smooth` 防止分母为零[^3]。 #### 2. 结合 Cross-Entropy Loss 使用 为了进一步提升模型效果,在实际训练过程中可以将 Dice Loss 和 Cross-Entropy Loss 联合起来使用。例如: ```python class CombinedLoss(nn.Module): def __init__(self, weight_dice=0.5, weight_ce=0.5): super(CombinedLoss, self).__init__() self.weight_dice = weight_dice self.weight_ce = weight_ce self.ce_loss = nn.CrossEntropyLoss() def forward(self, pred, target): ce = self.ce_loss(pred, target.argmax(dim=1)) dl = dice_loss(torch.softmax(pred, dim=1), target) total_loss = self.weight_dice * dl + self.weight_ce * ce return total_loss ``` 在此代码中,我们创建了一个自定义的组合损失函数类 `CombinedLoss`,该类能够灵活调整两种损失的比例权重[^4]。 #### 3. 应用到 Mask R-CNN 模型 对于 Mask R-CNN,可以通过修改其默认的损失配置来引入上述定义好的 Dice Loss 或者联合损失函数。假设您正在使用 Detectron2 进行开发,则可以在训练脚本中替换原有的实例分割部分损失设置为新的损失形式。 下面是一个简单的伪代码展示如何集成新损失至现有框架之中: ```python from detectron2.modeling.roi_heads import ROIHeads class CustomROIHeads(ROIHeads): def _forward_mask(self, features, instances): ... losses["loss_mask"] = combined_loss(mask_logits, gt_masks) return {...} ``` 这里展示了如何重写 `_forward_mask` 方法并调用自己的 `combined_loss` 函数替代原始的二元分类损失[^5]。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值