题解 \(by\;zj\varphi\)

概率与期望,考虑 \(\rm dp\)

设 \(dp_{i,j}\) 为消除 \(i~j\) 这一段行星的期望,转移:

枚举 \(k\) 为当前状态下第一个撞击的行星,分向左,向右。

\[\rm dp_{i,j}=\sum_{k=i}^jdp_{i,k-1}+dp_{k+1,i}+E_{k+1,j}-pos_k
\]
\[\rm dp_{i,j}=\sum_{k=i}^jdp_{i,k-1}+dp_{k+1,i}-E_{i,k-1}+pos_k
\]

\(\rm E_{i,j}\) 表示 \(\rm i->j\) 的期望位置,转移与 \(\rm dp\) 类似。

这样就可以 \(\mathcal O\rm (n^3)\),加个前缀和即可优化成 \(\mathcal O\rm(n^2)\)

Code
#include<bits/stdc++.h>
#define ri register signed
#define p(i) ++i
using namespace std;
namespace IO{
char buf[1<<21],*p1=buf,*p2=buf,OPUT[100];
#define gc() p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?(-1):*p1++;
template<typename T>inline void read(T &x) {
ri f=1;x=0;register char ch=gc();
while(!isdigit(ch)) {if (ch=='-') f=0;ch=gc();}
while(isdigit(ch)) {x=(x<<1)+(x<<3)+(ch^48);ch=gc();}
x=f?x:-x;
}
template<typename T>inline void print(T x,char t) {
if (x<0) putchar('-'),x=-x;
if (!x) return putchar('0'),(void)putchar(t);
ri cnt(0);
while(x) OPUT[p(cnt)]=x%10,x/=10;
for (ri i(cnt);i;--i) putchar(OPUT[i]^48);
return (void)putchar(t);
}
}
using IO::read;using IO::print;
namespace nanfeng{
#define int long long
#define FI FILE *IN
#define FO FILE *OUT
template<typename T>inline T cmax(T x,T y) {return x>y?x:y;}
template<typename T>inline T cmin(T x,T y) {return x>y?y:x;}
static const int N=3e3+7,MOD=998244353;
int dp[N][N],suf[N][N],pre[N][N],ex[N][N],a1[N][N],a2[N][N],inv[N],pa[N],n;
inline int main() {
//FI=freopen("nanfeng.in","r",stdin);
//FO=freopen("nanfeng.out","w",stdout);
read(n);
inv[1]=1;
ri al=(n<<1)+1;
for (ri i(2);i<=al;p(i)) inv[i]=(MOD-MOD/i)*inv[MOD%i]%MOD;
for (ri i(1),pla;i<=n;p(i)) {
read(ex[i][i-1]),read(pla);
pa[i]=(pa[i-1]+pla)%MOD;
}
read(ex[n+1][n]);
for (ri i(n);i;--i)
for (ri j(i);j<=n;p(j)) {
pre[i][j]=(pre[i][j-1]+ex[i][j-1])%MOD;
suf[j][i]=(suf[j][i+1]+ex[i+1][j])%MOD;
ex[i][j]=(pre[i][j]+suf[j][i])*inv[j-i+1]%MOD*inv[2]%MOD;
dp[i][j]=(dp[i][j]+2*(a1[i][j-1]+a2[j][i+1])%MOD)%MOD;
dp[i][j]=(dp[i][j]+pa[j]-pa[i-1]-pre[i][j])%MOD;
dp[i][j]=(dp[i][j]-pa[j]+pa[i-1]+suf[j][i])%MOD;
dp[i][j]=dp[i][j]*inv[j-i+1]%MOD*inv[2]%MOD;
a1[i][j]=(a1[i][j-1]+dp[i][j])%MOD;
a2[j][i]=(a2[j][i+1]+dp[i][j])%MOD;
}
print((dp[1][n]+MOD)%MOD,'\n');
return 0;
}
#undef int
}
int main() {return nanfeng::main();}

最新文章

  1. iOS开发之APP上线
  2. VS中Debug和Realease、及静态库和动态库的区别整理(转)
  3. c++ struct的两个注意点
  4. Delphi静态加载DLL和动态加载DLL示例
  5. java之表达式陷阱
  6. android Gallery滑动不流畅的解决
  7. Spring3 MVC 拦截器拦截不到的问题
  8. [LeetCode82]Remove Duplicates from Sorted List II
  9. devexpress设置皮肤、字体以及折叠菜单、伸缩Panel的实现
  10. 浩哥解析MyBatis源码(十)——Type类型模块之类型处理器
  11. linux指令札记
  12. 《Linux内核分析》第八周笔记 进程的切换和系统的一般执行过程
  13. excel怎么在插入的方框上打勾
  14. C++语言中数组指针和指针数组彻底分析
  15. 【BZOJ】3790 神奇项链
  16. BZOJ 1430 小猴打架(prufer编码)
  17. Reabble.com-KindleRSS新闻杂志订阅
  18. lumen 事件
  19. 解决dubbo-admin管控台不能显示服务的问题
  20. Python学习笔记:装饰器

热门文章

  1. 比较app版本大小----python
  2. Python单元测试框架unittest之深入学习
  3. nmcli device and nmcli connection
  4. c语言:2.3.3
  5. C语言:小数(float double)
  6. Centos7下的rabbitmq-server-3.8.11安装配置
  7. Leetcode春季打卡活动 第二题:206. 反转链表
  8. 【转载】PHP 程序员进阶之路
  9. 2个Double字符串进行
  10. C#计算复利方法