hdu4576 概率dp n^2的矩阵
这个题目看网上好多题解都是直接O(n*m)卡过。我是这么做的。
对于m次操作,统计每个w的次数。然后对每个w做矩阵乘法。
这样直接做矩阵乘法是会TLE的。
又由于这里的矩阵很特殊,一次乘法可以降维成O(n^2)。
--------------------------
怎么降维的可以这样模拟下:
a b c a b c a*a+2bc c*c+2ab b*b+2ac
c a b * c a b = b*b+2ac a*a+2bc c*c+2ab
b c a b c a c*c+2ab b*b+2ac a*a+2bc
注意到原矩阵的每一行(除了第一行)都是上一行向右平移一个单位的结果,而相乘得到的矩阵也满足这个性质。
那么做一次矩阵乘法的时候,就只用算出结果矩阵的第一行,然后下面的每一行直接可由上一行得到。
复杂度降为了O(n^2)。
-------------------------
所以一个总的复杂度<O(n^2 * log1000000 * 100)=8千万.
不到2000msAC了^_^
#include<cstdio>
#include<iostream>
#include<iomanip>
#include<cstring>
#include<cmath>
#include<set>
#include<map>
#include<queue>
#include<stack>
#include<string>
#include<vector>
#include<ctype.h>
#include<algorithm>
using namespace std;
typedef long long LL;
#define FF(i,x) for(i=1;i<=x;i++)
const int N = ; double cMat[N][N],retMat[N][N]; void matrixMul1(double A[][N],double B[][N],int a,int b)
{
double buff[N][N]={};
int i,j,k;
FF(i,a) FF(k,a) FF(j,b)
buff[i][j] = buff[i][j] + A[i][k]*B[k][j];
FF(i,a) FF(j,b) B[i][j]=buff[i][j];
} void matrixMul2(double A[][N],double B[][N],int a,int b)
{
double buff[N][N]={};
for(int j=;j<=a;j++)
{
for(int k=;k<=a;k++)
buff[][j]+=A[][k]*B[k][j];
}
for(int i=;i<=a;i++)
{
for(int j=;j<=a;j++) buff[i][j]=buff[i-][j-];
buff[i][]=buff[i-][a];
}
int i,j;
FF(i,a) FF(j,b) B[i][j]=buff[i][j];
} void matrixFastPow(int p,int n)
{
for(;p;p>>=)
{
if( p& ) matrixMul1(cMat,retMat,n,);
matrixMul2(cMat,cMat,n,n);
}
} int amount[]; int main()
{
int n,m,l,r;
int w; while( scanf("%d%d%d%d",&n,&m,&l,&r),n||m||l||r )
{
memset(amount,,sizeof(amount));
for(int i=;i<m;i++)
{
scanf("%d",&w);
amount[w]++;
}
for(int i=;i<=n;i++)
if( i<l || i>r ) retMat[i][]=0.0;
else retMat[i][]=1.0;
for(int i=;i<=;i++)
if( amount[i] )
{
for(int p=;p<=n;p++)
for(int q=;q<=n;q++)
cMat[p][q]=0.0;
for(int j=;j<=n;j++)
{
int a=(j-i);
while( a<= ) a+=n;
int b=(j+i);
while( b>n ) b-=n;
cMat[j][a]+=0.5;
cMat[j][b]+=0.5;
}
matrixFastPow(amount[i],n);
} printf("%.4f\n",retMat[][]);
}
return ;
}
hdu4576 概率dp n^2的矩阵的更多相关文章
- poj 3744 Scout YYF I (矩阵快速幂 优化 概率dp)
题目链接 分析&&题意来自 : http://www.cnblogs.com/kuangbin/archive/2012/10/02/2710586.html 题意: 在一条不满地雷的 ...
- 2018.09.27 bzoj2510: 弱题(概率dp+循环矩阵优化)
传送门 简单概率dp. 显然每次转移的式子可以用一个矩阵表示出来: 这个是循环矩阵. 因此只用维护第一行快速幂一波就行了. 代码: #include<bits/stdc++.h> #def ...
- 【loj2325】「清华集训 2017」小Y和恐怖的奴隶主 概率dp+倍增+矩阵乘法
题目描述 你有一个m点生命值的奴隶主,奴隶主受伤未死且当前随从数目不超过k则再召唤一个m点生命值的奴隶主. T次询问,每次询问如果如果对面下出一个n点攻击力的克苏恩,你的英雄期望会受到到多少伤害. 输 ...
- POJ3744 Scout YYF I 概率DP+矩阵快速幂
http://poj.org/problem?id=3744 题意:一条路,起点为1,有概率p走一步,概率1-p跳过一格(不走中间格的走两步),有n个点不能走,问到达终点(即最后一个坏点后)不踩坏点的 ...
- poj 3744 概率dp+矩阵快速幂
题意:在一条布满地雷的路上,你现在的起点在1处.在N个点处布有地雷,1<=N<=10.地雷点的坐标范围:[1,100000000]. 每次前进p的概率前进一步,1-p的概率前进1-p步.问 ...
- hdu 4576(简单概率dp | 矩阵优化)
艰难的一道题,体现出菜菜的我... 首先,先吐槽下. 这题到底出题人是怎么想的,用普通概率dp水过??? 那为什么我概率dp写的稍微烂点就一直tle? 感觉很不公平.大家算法都一致,因为我程序没有那 ...
- 【bzoj1778】[Usaco2010 Hol]Dotp 驱逐猪猡 矩阵乘法+概率dp+高斯消元
题目描述 奶牛们建立了一个随机化的臭气炸弹来驱逐猪猡.猪猡的文明包含1到N (2 <= N <= 300)一共N个猪城.这些城市由M (1 <= M <= 44,850)条由两 ...
- HDU 5607 graph(矩阵优化+概率DP)
该题非常easy想到求概率的转移方程:用d[i][j]表示第i步,走到j点的概率. 可是该题的k高达1e9.所以依照套路.要用矩阵相乘来优化. 第一次写矩阵相乘. 大概的意思就是利用矩阵实现递推. 而 ...
- poj3744 (概率DP+矩阵快速幂)
http://poj.org/problem?id=3744 题意:在一条铺满地雷的路上,你现在的起点在1处.在N个点处布有地雷,1<=N<=10.地雷点的坐标范围:[1,10000000 ...
随机推荐
- WWDC 2016: Rich Notifications in iOS 10
Notifications have gotten more than a visual refresh in iOS 10. As part of the new UserNotifications ...
- 移动端material风格日期时间选择器
原文 好多时候在移动端需要一个的日期选择器,由于在应用上有可能应用各种框架库(Vue.js, React.js, zepto.js等):所以说一个无依赖的,这样易于上层进行封装.直接开门见山,先来张动 ...
- 【WCF--初入江湖】08 并发与实例模式
08 并发与实例模式 1. 实例上下文模式 一个服务代理:servicePoxy ChannelFactory<IService1> factoryservicel = new Cha ...
- 对于WIFI版ipad(无GPS芯片)定位功能的释疑
把玩ipad(WIFI版ipad,无GPS芯片)很久时间了,曾今有很多人(包括我)也用过它的定位功能,发现它确实很准确,通常的误差在40米以内,所以很多人都怀疑这个版本的ipad是不是真的内置了GPS ...
- Unity3D脚本中文系列教程(十一)
http://dong2008hong.blog.163.com/blog/static/4696882720140313058768/ BoxCollider 类,继承自Collider 一个盒状的 ...
- 盘点 DevOps 世界的杰出女性(一)
[编者按]IT 领域从来不缺乏杰出的女性存在,近日,DevOps.com 主编 Alan Shimel 盘点了 DevOps 领域的杰出女性,首期为六个,本文系 OneAPM 工程师编译整理. 以下为 ...
- 【面试题004】c/c++字符串,替换空格
一,c/c++字符串 1.C/C++中每个字符串都以字符’\0‘作为结尾,这样我们就能很方便地找到字符串的最后尾部. 由于这个原因每个字符串都有一个额外的开销,注意字符串越界的问题: 2.C/C+ ...
- strut2的原理
Struts2 在项目中用到的核心是拦截器interceptor,OGNL(Object Graph navigation Language)对象图导航语言(用来操作ValueStack里面的数据), ...
- PHP图标类库 - JpGraph使用详解
http://w3note.com/web/181.html 微信平台开发的推广支持应用里,为了满足用户渠道推广分析的需要,公众平台提供了生成带参数二维码的接口.使用该接口可以获得多个带不同场景值的二 ...
- lintcode:strStr 字符串查找
题目: 字符串查找 字符串查找(又称查找子字符串),是字符串操作中一个很有用的函数.你的任务是实现这个函数. 对于一个给定的 source 字符串和一个 target 字符串,你应该在 source ...