FJ省队集训最终测试 T3






思路:状态压缩dp,f[i][j[[k]代表i行j列这个格子,连续的状态为k,这个连续的状态是什么?就是下图

X格子代表我当前走到的地方,而这里的状态就是红色部分,也就是连续的一段n的状态,我们是分每一位计算的,这样就可以转移了,注意,当当前点在最下面的时候要额外计算一个与1的贡献。
坑爹,inf设小了只有30分。
#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
#include<algorithm>
#define ll long long
const ll inf=1e18;
ll f[][],bin[],sum[],ans;
ll a[][],b[][],c1[][],c2[][];
ll s[];
int n,m;
ll read(){
ll t=,f=;char ch=getchar();
while (ch<''||ch>''){if (ch=='-')f=-;ch=getchar();}
while (''<=ch&&ch<=''){t=t*+ch-'';ch=getchar();}
return t*f;
}
ll query(int id,int j,int st){
int top=;
for (int i=;i<=n;i++){
s[++top]=st%;
st/=;
}
s[]=s[top];s[top+]=s[];
ll res=;
for (int i=;i<=n;i++)
res+=((s[i]*bin[id])^(a[i][j]&bin[id]))*b[i][j];
for (int i=;i<=n;i++)
res+=((s[i]*bin[id])^(bin[id]*s[i+]))*c2[i][j];
return res;
}
void dp(int id){
int tot=(<<n)-,cnt=;
for (int i=;i<=n*m;i++)
for (int j=;j<=tot;j++)
f[i][j]=inf;
for (int i=;i<=tot;i++)
f[n][i]=query(id,,i);
for (int j=;j<=m;j++)
for (int i=;i<=n;i++){
int now=(j-)*n+i,pre=now-;
for (int st=;st<=tot;st++){
int st1=st&sum[n-],lst=((st&bin[n-])>),ths=((st&bin[n-])>);
ll tmp=;
if (i!=) tmp+=((lst^ths)*c2[i-][j])*bin[id];
if (i==n) tmp+=(((st&bin[])^ths)*c2[i][j])*bin[id];
tmp+=((a[i][j]&bin[id])^(ths*bin[id]))*b[i][j];
for (int k=;k<=;k++){
int st2=st1*+k,beh=((st2&bin[])>);
ll tmp2=(beh^ths)*bin[id]*c1[i][j-];
f[now][st]=std::min(f[now][st],f[pre][st2]+tmp+tmp2);
}
}
}
ll Tmp=inf;
for (int i=;i<=tot;i++)
Tmp=std::min(f[n*m][i],Tmp);
ans+=Tmp;
}
int main(){
n=read();m=read();bin[]=;
for (int i=;i<=;i++) bin[i]=bin[i-]*;sum[]=bin[];
for (int i=;i<=;i++) sum[i]=sum[i-]+bin[i];
for (int i=;i<=n;i++)
for (int j=;j<=m;j++)
a[i][j]=read();
for (int i=;i<=n;i++)
for (int j=;j<=m;j++)
b[i][j]=read();
for (int i=;i<=n;i++)
for (int j=;j<m;j++)
c1[i][j]=read();
for (int i=;i<=n;i++)
for (int j=;j<=m;j++)
c2[i][j]=read();
for (int i=;i<=;i++){
dp(i);
}
printf("%I64d\n",ans);
fclose(stdin);fclose(stdout);
return ;
}
FJ省队集训最终测试 T3的更多相关文章
- FJ省队集训最终测试 T2
思路:发现如果一个人一共选了x个点,那么选中某一个点对的概率都是一样的,一个人选x个点的总方案是C(n,x),一个人选中某个点对的总方案是C(n-2,x-2),这样,那么选中某个点对的概率就是 x*( ...
- FJ省队集训DAY4 T3
#include<cstdio> #include<iostream> #include<cmath> #include<cstring> #inclu ...
- FJ省队集训DAY5 T1
思路:考试的时候打了LCT,自以为能过,没想到只能过80.. 考完一想:lct的做法点数是100W,就算是nlogn也会T. 讲一下lct的做法把:首先如果一条边连接的两个点都在同一个联通块内,那么这 ...
- FJ省队集训DAY4 T2
XXX #include<cstdio> #include<iostream> #include<cmath> #include<cstring> #i ...
- FJ省队集训DAY4 T1
直接上题解 #include<cstdio> #include<iostream> #include<cmath> #include<cstring> ...
- FJ省队集训DAY3 T2
思路:如果一个DAG要的路径上只要一条边去切掉,那么要怎么求?很容易就想到最小割,但是如果直接做最小割会走出重复的部分,那我们就这样:反向边设为inf,这样最小割的时候就不会割到了,判断无解我们直接用 ...
- FJ省队集训DAY3 T1
思路:我们考虑如果取掉一个部分,那么能影响到最优解的只有离它最近的那两个部分. 因此我们考虑堆维护最小的部分,离散化离散掉区间,然后用线段树维护区间有没有雪,最后用平衡树在线段的左右端点上面维护最小的 ...
- FJ省队集训DAY2 T2
思路:我们可以考虑三角剖分,这样问题就变成考虑三角形的选取概率和三角形内有多少个点了. 先用树状数组预处理出三角剖分的三角形中有多少个点,然后用线段树维护,先用原点极角排序,然后枚举i,再以i极角排序 ...
- FJ省队集训DAY2 T1
思路:转换成n条三维空间的直线,求最大的集合使得两两有交点. 有两种情况:第一种是以某2条直线为平面,这时候只要统计这个平面上有几条斜率不同的直线就可以了 还有一种是全部交于同一点,这个也只要判断就可 ...
随机推荐
- jsp中导入导出excel,ssh框架
导入Excel:jsp中 <form action="user_importTradingMoney" enctype="multipart/form-data&q ...
- nginx本地的测试环境添加SSL
要在本地添加SSL,首先要做的是防火墙是不是放开了443端口,同时,在nginx安装时是不是支持了ssl模块,这个安装网上很容易找到相关资料 防火墙,个人还是用iptables比较直观 先将selin ...
- AngularJs学习笔记5——自定义服务
前面整理了AngularJs双向数据绑定和自定义指令的相关内容,从手册上看也知道,ng部分还包括过滤器和函数,以及服务等. 过滤器:filter,就是对数据进行格式化,注意管道格式,例如: {{表达式 ...
- POJ 2513 Colored Sticks - from lanshui_Yang
题目大意:给定一捆木棒,每根木棒的每个端点涂有某种颜色.问:是否能将这些棒子首位项链,排成一条直线,且相邻两根棍子的连接处的颜色一样. 解题思路:此题是一道典型的判断欧拉回路或欧拉通路的问题,以木棍的 ...
- 模拟jquery封装选择器
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 忘记mysql 5.7的密码
for windows: http://blog.chinaunix.net/uid-27570589-id-3511820.html 一.将net stop mysql; 二.在命令行中 C:\Us ...
- 【转】UIKit性能调优实战讲解
文/bestswifter(简书作者)原文链接:http://www.jianshu.com/p/619cf14640f3著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”. 在使用UIKi ...
- XtraBackup做mysql主从同步
一.背景: 线上一个主库压力比较大,所以增加一个从库,但是不能重启或者停止主库的正常运行,不能锁库锁表影响业务的正常运行.所以这里想到了XtraBackup 二.XtraBackup介绍: Xtrab ...
- css属性之vertical-align详解
inline-block 该值会让元素生成一个内联级块容器(inline-level block container).一个inline-block的内部会被格式化成一个块盒,而该元素本身会被格式化成 ...
- [c#]asp.net开发微信公众平台(2)多层架构框架搭建和入口实现
上篇已经设计出比较完善的数据库了,这篇开始进入代码. 首先把上篇设计的数据库脚本在数据库中执行下,生成数据库,然后在VS中建立项目,为了方便理解和查看,我设计的都是很直白的类名和文件名,没有命名空间 ...