E - Integers on Grid

题意:给你一个矩阵,矩阵里面填了数,从一个格子出发,每一步可以沿着行或者列跳到比他数字大的格子,问每个点最多能跳多少步?

sol.从第到高转移,每次动态维护一个 当且列,当且行的最大值即可

F - Problem where +s Separate Digits

题意:给你一个字符串,可以在任意空格里填上加号,得到一个公式,问所有可行的公式的和是多少?

sol.考虑做到第\(i\)位,不妨预处理出 $ 以i为最右端点的数字和 * 其左边的方案数$,可以发现,再同时乘上右边的方案数,就是整个答案了

#include<bits/stdc++.h>
typedef long long ll;
#define MAXN 400005
#define INF 0x3f3f3f3f
const ll mod = 998244353;
using namespace std;

int n;
char a[MAXN];
ll sum[MAXN],f[MAXN],sum2[MAXN],ans;

ll poww(ll x , int y){
	ll zz = 1;
	while(y){
		if(y & 1)zz = (zz * x) % mod;
		x = (x * x) % mod;
		y = y >> 1;
	}
	return zz;
}

int main(){
	scanf("%s" , a + 1);
	n = strlen(a + 1);
	for(int i = 1 ; i <= n ; i++){
		sum[i] = ((sum[i - 1] * 10) % mod + (poww(2 , i - 1) * 1ll * (a[i] - '0')) % mod) % mod;
		if(i < n)ans = (ans + (sum[i] * poww(2 , n - i - 1)) % mod) % mod;
	}
	cout<<(ans + sum[n]) % mod<<endl;
	
}

但这么做不太香,看到官方题解---好妙

对一个字符串随机选空格中间加上+号,求最后得到的表达式的值的期望,再乘以\(2^{|S| - 1}\)

G - Roll or Increment

题意:给你一个\(N\)面骰子,一开始朝上的数字是\(S\), 你可以进行如下操作:

\(A\)日元,让朝上的数字变成当前朝上的数字加1,如果朝上的数字是\(N\),则不可以进行此操作

\(B\)日元,重新扔一次

以最省钱的策略操作,问把朝上的数字变成\(T\)的消费的期望。

G - Roll or Increment

题意:给你一个二分图,左边有\(L\)个点,右边有\(R\)个点,每个点安装一个摄像头需要花费若干钱。

给你一个\(L ∗ R\)的矩阵,要求你花最少的钱,使得$< L i , R j > $ , 有\(C_{ij}\)个摄像头