当前位置 : 主页 > 网络编程 > 其它编程 >

HZOI20190816模拟23mine/water/gcd

来源:互联网 收集:自由互联 发布时间:2023-07-02
A:mine只是一个简单的dp。。。。是博主太蒻了。。。设f[i][j],表示到第i位,状态是j的方案数,其中$j\in[0,5]$j0表示填0,j1表示填1,且i-1位是雷;j2 A:mine 只是一个简单的dp。。。。是博
A:mine只是一个简单的dp。。。。是博主太蒻了。。。设f[i][j],表示到第i位,状态是j的方案数,其中$j\in[0,5]$j0表示填0,j1表示填1,且i-1位是雷;j2

A:mine

只是一个简单的dp。。。。是博主太蒻了。。。

设f[i][j],表示到第i位,状态是j的方案数,其中$j\in[0,5]$

j==0表示填0,j==1表示填1,且i-1位是雷;

j==2表示填2,j==3表示填雷,j==5表示填1,且i-1位不是雷

思考一下,得到方程:

      $f[i][4]=f[i-1][3]$ $f[i][1]=f[i-1][4]+f[i-1][0]$

      $f[i][3]=f[i-1][1]+f[i-1][2]+f[i-1][3]$ $f[i][0]=f[i-1][4]+f[i-1][0]$ $f[i][2]=f[i-1][3]$

然后就没什么了

#include#include#include#include#define int long longusing namespace std;const int MAXN=1e6+1;const int mod=1e9+7;int len,ans=0,f[2][5];char s[MAXN];signed main(){scanf("%s",s+1);len=strlen(s+1);if(s[1]==‘*‘) f[1][3]=1;else if(s[1]==‘1‘) f[1][1]=1;else if(s[1]==‘0‘) f[1][0]=1;else if(s[1]==‘?‘) f[1][3]=f[1][1]=f[1][0]=1;for(int i=2;i<=len;i++){f[iif(s[i]==‘?‘){f[if[if[if[if[i}else if(s[i]==‘1‘){f[if[i}else if(s[i]==‘*‘){f[i}else if(s[i]==‘0‘){f[i}else{f[i}}ans=((f[lenprintf("%lld\n",ans);return 0;}

B:water

一个块的高度就是从这个块走出矩形的所有路径上的最大值的最小值。

相邻块连边,权值为两块的较大值,矩形边界的块向矩形外连边,权值为 max(高度,0),

做最小生成树,然后每个点的积水高度就是这个点到根节点路径上的最大边权减去这个点的点权

#include#include#include#include#define MAXN 305#define inf 0x7fffffffusing namespace std;int n,m,a[MAXN][MAXN],dep[MAXN*MAXN];int calc(int i,int j){return (i-1)*m+j;}struct node{int fr,to,w,nxt;friend bool operator <(node a,node b){return a.w

C:gcd

并不是gcd,好像有mobius反演的内容,博主先咕了

上一篇:HTML5videocontrolslistAllInOne
下一篇:没有了
网友评论