思路:状态压缩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的更多相关文章

  1. FJ省队集训最终测试 T2

    思路:发现如果一个人一共选了x个点,那么选中某一个点对的概率都是一样的,一个人选x个点的总方案是C(n,x),一个人选中某个点对的总方案是C(n-2,x-2),这样,那么选中某个点对的概率就是 x*( ...

  2. FJ省队集训DAY4 T3

    #include<cstdio> #include<iostream> #include<cmath> #include<cstring> #inclu ...

  3. FJ省队集训DAY5 T1

    思路:考试的时候打了LCT,自以为能过,没想到只能过80.. 考完一想:lct的做法点数是100W,就算是nlogn也会T. 讲一下lct的做法把:首先如果一条边连接的两个点都在同一个联通块内,那么这 ...

  4. FJ省队集训DAY4 T2

    XXX #include<cstdio> #include<iostream> #include<cmath> #include<cstring> #i ...

  5. FJ省队集训DAY4 T1

    直接上题解 #include<cstdio> #include<iostream> #include<cmath> #include<cstring> ...

  6. FJ省队集训DAY3 T2

    思路:如果一个DAG要的路径上只要一条边去切掉,那么要怎么求?很容易就想到最小割,但是如果直接做最小割会走出重复的部分,那我们就这样:反向边设为inf,这样最小割的时候就不会割到了,判断无解我们直接用 ...

  7. FJ省队集训DAY3 T1

    思路:我们考虑如果取掉一个部分,那么能影响到最优解的只有离它最近的那两个部分. 因此我们考虑堆维护最小的部分,离散化离散掉区间,然后用线段树维护区间有没有雪,最后用平衡树在线段的左右端点上面维护最小的 ...

  8. FJ省队集训DAY2 T2

    思路:我们可以考虑三角剖分,这样问题就变成考虑三角形的选取概率和三角形内有多少个点了. 先用树状数组预处理出三角剖分的三角形中有多少个点,然后用线段树维护,先用原点极角排序,然后枚举i,再以i极角排序 ...

  9. FJ省队集训DAY2 T1

    思路:转换成n条三维空间的直线,求最大的集合使得两两有交点. 有两种情况:第一种是以某2条直线为平面,这时候只要统计这个平面上有几条斜率不同的直线就可以了 还有一种是全部交于同一点,这个也只要判断就可 ...

随机推荐

  1. 【HDOJ】1493 QQpet exploratory park

    超水的动态规划.最后要对概率求Sigma. #include <cstdio> #include <cstring> #include <cstdlib> #def ...

  2. alias, bg, bind, break, builtin, caller, cd, command,

    bash,  :,  .,  [, alias, bg, bind, break, builtin, caller, cd, command,       compgen, complete, com ...

  3. BZOJ3389: [Usaco2004 Dec]Cleaning Shifts安排值班

    3389: [Usaco2004 Dec]Cleaning Shifts安排值班 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 45  Solved:  ...

  4. HDOJ 1282 回文数猜想(回文串类)

    Problem Description 一个正整数,如果从左向右读(称之为正序数)和从右向左读(称之为倒序数)是一样的,这样的数就叫回文数.任取一个正整数,如果不是回文数,将该数与他的倒序数相加,若其 ...

  5. JAVA面向对象总结

    面向对象概述       面向对象是当前计算机界关心的重点,它是90年代软件开发方法的主流.面向对象的概念和应用已超越程序设计和软件开发,如数据库系统.交互式界面.应用结构.应用平台.分布式系统.网络 ...

  6. SqlServer 挂载本地盘符到服务器端,方面备份还原

    --此脚本要在登录上SqlServer远程服务器后才能执行,把数据库备份到本地(内网使用) --(例如我用本机SqlServer客户端连接上192.168.3.12服务器时,执行脚本,可以把指定数据库 ...

  7. 设计模式&UML学习

    1. 1.1 1.2 2. 2.1 2.2 3.参考文档 [1] 陈金荣:http://blog.csdn.net/cjr15233661143/article/details/8532997 [2] ...

  8. javascript 实现分享功能

    1.面向过程分享 <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...

  9. 【iOS基础】iOS 网络请求

    一.一个HTTP请求的基本要素1.请求URL:客户端通过哪个路径找到服务器 2.请求参数:客户端发送给服务器的数据* 比如登录时需要发送的用户名和密码 3.返回结果:服务器返回给客户端的数据* 一般是 ...

  10. i++与++i的区别,使用实例说明

    /** * 类名:TEST.java<br> * <p> * 功能:i++与++i的区别,使用实例说明 * </p> * * @Author:<a href= ...