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条直线为平面,这时候只要统计这个平面上有几条斜率不同的直线就可以了 还有一种是全部交于同一点,这个也只要判断就可 ...
随机推荐
- 俄罗斯方块:Python实现
网上搜到一个Pygame写的俄罗斯方块(tetris),大部分看懂的前提下增加了注释,Fedora19下运行OK的 主程序: #coding:utf8 #! /usr/bin/env python # ...
- BZOJ3391: [Usaco2004 Dec]Tree Cutting网络破坏
3391: [Usaco2004 Dec]Tree Cutting网络破坏 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 47 Solved: 37[ ...
- linux 信号signal和sigaction理解
今天看到unp时发现之前对signal到理解实在浅显,今天拿来单独学习讨论下. signal,此函数相对简单一些,给定一个信号,给出信号处理函数则可,当然,函数简单,其功能也相对简单许多,简单给出个函 ...
- Android读取Assert文件夹下txt文本并变为String的方法
使用场景,在assert文件夹下 有些文本文件,我们需要通过工具类读取出来,然后放到String字符串中,我们该如何操作呢: 直接上代码: 使用方法: MyActivity.readAssertRes ...
- 【李婶小教程】(SE_lab3)
额,今天说一下这个SE_lab3那几个东西都是怎么装的. 啊--其实技术含量貌似不是很高的. 1.先说最简单的一个叫做:Findbugs 点这个Eclipse Marketplace,这是一个神奇的东 ...
- Map的遍历方法及String和其它类型的相互转化
Map的遍历方法: package com.lky.test; import java.util.HashMap; import java.util.Iterator; import java.uti ...
- 修改文件所有者 chown
将upload目录权限改为777,sudo chmod 777 upload,再测试上传功能成功.但这种修改权限的方法并不安全.故可以改upload目录的拥有者为www-data(即apache) ...
- StringBuffer和StringBuilder使用方法比較
StringBuffer是字符串缓冲区,是一个容器. 特点: 1,长度是可变化的. 2,能够字节操作多个数据类型. 3,终于会通过toString方法变成字符串. C create U update ...
- Java基础知识强化42:StringBuffer类之StringBuffer的截取功能
1. StringBuffer的截取功能: public String subString(int Start): public String subString(int Start, int end ...
- Java多线程练习二
public class ex3 { public static void main(String [] args) { thread2 t1 = new thread2("hello&qu ...