HDOJ5245 Joyful(dp)

Joyful

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 506    Accepted Submission(s): 219


Problem Description
Sakura has a very magical tool to paint walls. One day, kAc asked Sakura to paint a wall that looks like an  M×N  matrix. The wall has  M×N  squares in all. In the whole problem we denotes  (x,y)  to be the square at the  x -th row,  y -th column. Once Sakura has determined two squares  (x1,y1)  and  (x2,y2) , she can use the magical tool to paint all the squares in the sub-matrix which has the given two squares as corners.

However, Sakura is a very naughty girl, so she just randomly uses the tool for  K  times. More specifically, each time for Sakura to use that tool, she just randomly picks two squares from all the  M×N  squares, with equal probability. Now, kAc wants to know the expected number of squares that will be painted eventually.
 

Input
The first line contains an integer  T ( T100 ), denoting the number of test cases.

For each test case, there is only one line, with three integers  M,N  and  K .
It is guaranteed that  1M,N500 1K20 .
 

Output
For each test case, output ''Case #t:'' to represent the  t -th case, and then output the expected number of squares that will be painted. Round to integers.
 

Sample Input
  
  
2 3 3 1 4 4 2
 

Sample Output
  
  
Case #1: 4 Case #2: 8
Hint
The precise answer in the first test case is about 3.56790123.
 



概率dp,谁做出来商kalili香吻一枚2333


参考了点击打开链接


就是把矩阵拆分,对每个小矩阵计算概率。


AC代码:


#include "iostream"
#include "cstdio"
#include "cstring"
#include "algorithm"
#include "cmath"
using namespace std;
int t, k;
double n, m;
int main(int argc, char const *argv[])
{
	scanf("%d", &t);
	for(int cas = 1; cas <= t; ++cas) {
		scanf("%lf%lf%d", &n, &m, &k);
		double ans = 0;
		for(double i = 1; i <= n; ++i)
			for(double j = 1; j <= m; ++j) {
				double p = m * n;
				p += (i - 1) * (j - 1) * (n - i + 1) * (m - j + 1);
				p += (i - 1) * (m - j) * (n - i + 1) * j;
				p += (j - 1) * (n - i) * (m - j + 1) * i;
				p += (n - i) * (m - j) * i * j;
				p += (i - 1) * m * (n - i + 1);
				p += (m - j) * n * j;
				p += (n - i) * m * i;
				p += (j - 1) * n * (m - j + 1);
				p = p / n / n / m / m;
				ans += 1 - pow(1 - p, k);
			}
		printf("Case #%d: %d\n", cas, int(ans + 0.5));
	}
	return 0;
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值