$[TJOI2017]$ 可乐 矩阵优化$dp$
\(Sol\)
设\(f_i\)为到第\(i\)秒的方案数,显然\(f_i=\)在第\(i\)秒前爆炸的方案数+在第\(i\)秒爆炸的方案数+在第\(i\)秒停下的方案数+在第\(i\)秒走向下一个城市
的方案数.注意到第四个转移和当前在哪个城市有关,所以要另记一维\(j\)表示当前位置.于是\(f_{i,j}=\)第\(i\)秒前在\(j\)爆炸的方案数+第\(i\)秒在\(j\)爆炸的方案数+第\(i\)秒停在\(j\)的方案数+第\(i\)秒由别的城市走向\(j\)的方案数.记这四个量分别为\(f1,f2,f3,f4\).
\(f1_{i,j}=f1_{i-1,j}+f2_{i-1,j}\)
\(f2_{i,j}=f3_{i-1,j}+f4_{i-1,j}\)
\(f3_{i,j}=f3_{i-1,j}+f4_{i-1,j}\)
\(f4_{i,j}=f3_{i-1,k}+f4_{i-1,k}\),其中,\(k\)是\(j\)的相邻城市.
这样瞎\(dp\)一下就可以获得\(20pts\)的好成绩\(QAQ\).
其实上面的转移方程看起来就很矩阵优化的亚子,于是矩阵优化一下就好辣.
\(Code\)
#include<bits/stdc++.h>
#define il inline
#define Ri register int
#define go(i,a,b) for(Ri i=a;i<=b;++i)
#define yes(i,a,b) for(Ri i=a;i>=b;--i)
#define e(i,u) for(Ri i=b[u];i;i=a[i].nt)
#define mem(a,b) memset(a,b,sizeof(a))
#define ll long long
#define db double
#define inf 2147483647
using namespace std;
il int read()
{
Ri x=0,y=1;char c=getchar();
while(c<'0'||c>'9'){if(c=='-')y=-1;c=getchar();}
while(c>='0'&&c<='9'){x=(x<<1)+(x<<3)+c-'0';c=getchar();}
return x*y;
}
const int mod=2017;
int n,m,t,as;
vector<int>to[31];
struct mt
{
int a[121][121];bool ste;
il void clear(){mem(a,0);ste=0;}
}trs,cur;
il void inc(Ri &x,Ri y){x+=y;if(x>=mod)x-=mod;}
il mt operator * (mt x,mt y)
{
mt z;z.clear(),z.ste=x.ste;Ri h=x.ste?1:n*4;
go(i,1,h)
go(j,1,n*4)
go(k,1,n*4)
inc(z.a[i][j],1ll*x.a[i][k]*y.a[k][j]%mod);
return z;
}
il void init()
{
trs.clear();
go(i,1,n)
{
Ri mi=(i-1)*4+1;
trs.a[mi][mi]=trs.a[mi+1][mi]=1;
trs.a[mi+2][mi+1]=trs.a[mi+3][mi+1]=1;
trs.a[mi+2][mi+2]=trs.a[mi+3][mi+2]=1;
go(j,0,(int)to[i].size()-1){Ri k=(to[i][j]-1)*4+3;trs.a[k][mi+3]=trs.a[k+1][mi+3]=1;}
}
}
int main()
{
n=read(),m=read();
go(i,1,m){Ri u=read(),v=read();to[u].push_back(v),to[v].push_back(u);}
init();cur.clear();cur.a[1][3]=1,cur.ste=1;
t=read();
while(t){if(t&1)cur=cur*trs;trs=trs*trs;t>>=1;}
go(i,1,n*4)inc(as,cur.a[1][i]);
printf("%d\n",as);
return 0;
}
随机推荐
- 20-1 django上传文件和项目里上传头像如何查看
一 普通上传方式 1 views def upload(request): if request.method == "POST": # print(request.POST) # ...
- Data Flow-File Read-基本过程
- HZOJ 匹配
Hash/KMP裸题,并不想写什么,只是复习一下KMP吧. void get_n() { next[]=; ; ;i<=lt;i++) { && t[i]!=t[j+])j=ne ...
- day3_python之函数返回值、语句形式、表达式形式
一. 函数对象 1. 函数是第一类对象,即函数可以当作数据传递 #1 可以被引用 #2 可以当作参数传递 #3 返回值可以是函数 #3 可以当作容器类型的元素 二.返回值 return的返回值没有类型 ...
- selenium webdriver学习(三)------------执行js脚本
selenium webdriver学习(三)------------执行js脚本 博客分类: Selenium-webdriver 在用selenium 1.X的时候常常会用到getEval() ...
- BZOJ 1935 Tree 园丁的烦恼 CDQ分治/主席树
CDQ分治版本 我们把询问拆成四个前缀和,也就是二维前缀和的表达式, 我们把所有操作放入一个序列中 操作1代表在x,y出现一个树 操作2代表加上在x,y内部树的个数 操作3代表减去在x,y内部树的个数 ...
- 2015年热门的国产开源软件TOP 50
2015年热门的国产开源软件TOP 50 开源中国在 2015 年得到了快速的发展,单开源软件收藏量就接近 40000 款,其中不乏优质的国产开源项目.本文从软件的收藏.下载.访问等多角度挑选出了 2 ...
- Ubuntu16.04.3深度学习环境搭建
依赖 pip3 install pillow 安装numpy相关sudo apt-get install python-numpy python-scipy python-matplotlib ipy ...
- 2018-8-10-win10-uwp-调试软件启动
title author date CreateTime categories win10 uwp 调试软件启动 lindexi 2018-08-10 19:16:51 +0800 2018-03-0 ...
- ant 脚本 available 及条件判断功能
1. 通过<available property="属性名" file | classname | resource = "被判定是否存在的东西" v ...