博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
codeforces D. Painting The Wall
阅读量:5323 次
发布时间:2019-06-14

本文共 1314 字,大约阅读时间需要 4 分钟。

http://codeforces.com/problemset/problem/399/D

题意:给出n和m,表示在一个n*n的平面上有n*n个方格,其中有m块已经涂色。现在随机选中一块进行涂色(如果已经涂色跳过,也消耗时间),消耗1个步骤。终止条件为每行每列都有至少有一块瓷砖被涂色。问说涂成满意的情况需要时间的期望。

思路:把整个方格分成四部分,如果选择左上角上的一块,那么行和列都将被涂上一个;右上角的话,行被涂上一个,列不变;左下角的话,行不变,列被涂上一个;右下角,行列都不变。

状态转移方程:dp[i][j]=(dp[i+1][j]*(n-i)*j+dp[i][j+1]*(n-j)*i+dp[i+1][j+1]*(n-i)*(n-j)+n*n)/(n*n-i*j);

1 #include 
2 #include
3 #include
4 #include
5 #define LL __int64 6 using namespace std; 7 8 int n,m; 9 int nr[2010],nc[2010];10 double dp[2010][2010];11 12 int main()13 {14 scanf("%d%d",&n,&m);15 int tr=0,tc=0;16 for(int i=1; i<=m; i++)17 {18 int r,c;19 scanf("%d%d",&r,&c);20 if(!nr[r])21 {22 tr++;23 nr[r]++;24 }25 if(!nc[c])26 {27 tc++;28 nc[c]++;29 }30 }31 dp[n][n]=0;32 for(int i=n; i>=0; i--)33 {34 for(int j=n; j>=0; j--)35 {36 if(i!=n||j!=n)37 dp[i][j]=(double)((n-i)*j*dp[i+1][j]+i*(n-j)*dp[i][j+1]+(n-i)*(n-j)*dp[i+1][j+1]+n*n)/(n*n-i*j);38 }39 }40 printf("%.10lf\n",dp[tr][tc]);41 return 0;42 }
View Code

 

转载于:https://www.cnblogs.com/fanminghui/p/4260853.html

你可能感兴趣的文章
bzoj2257
查看>>
http://www.bootcss.com/
查看>>
20145308 《网络对抗》 注入shellcode+Return-to-libc攻击 学习总结
查看>>
查看oracle数据库的连接数以及用户
查看>>
python tkinter GUI绘制,以及点击更新显示图片
查看>>
Spring面试题
查看>>
C语言栈的实现
查看>>
SRM 628 DIV2
查看>>
2018-2019-2 20165314『网络对抗技术』Exp5:MSF基础应用
查看>>
SecureCRT的使用方法和技巧(详细使用教程)
查看>>
自建数据源(RSO2)、及数据源增强
查看>>
2018icpc徐州OnlineA Hard to prepare
查看>>
使用命令创建数据库和表
查看>>
【转】redo与undo
查看>>
安卓当中的线程和每秒刷一次
查看>>
wpf样式绑定 行为绑定 事件关联 路由事件实例
查看>>
TCL:表格(xls)中写入数据
查看>>
Oracle事务
查看>>
String类中的equals方法总结(转载)
查看>>
标识符
查看>>