Ural 1519. Formula 1 优美的插头DP

今天早上学了插头DP的思想和最基础的应用,中午就开始敲了,岐哥说第一次写不要看别人代码,利用自己的理解一点点得写出来,这样才锻炼代码能力!于是下午慢慢地构思轮廓,一点点地敲出主体代码,其实是很磨蹭的,由于要考虑好多东西,而且昨晚2点睡的有点困,最后终于磨蹭出来了,第一次的代码搓没关系,自己写的才重要。然后果然不出我所料,调试到了晚上才A了(一个郁闷的错误)。。。A的感觉真的是爽呀,虽然搞了差不多一天。当然自己写了自己想的代码后也要把代码优化,不然队友看不懂自己代码就囧了。。。


插头DP,建议大家想学的好好看看陈丹琦的国家集训队论文,这是个优美的DP。

http://www.docin.com/p-46797997.html


 

#include <stdio.h>
#include <string.h>#define LL __int64const int mod = 10007;//   哈希表
struct HASH{int head[mod+10], E, next[80000];LL val[80000], cnt[80000];void init() {memset(head, -1, sizeof(head));E = 0;}int findhash(LL x) {return (x%mod + mod)%mod;}void add(LL x, LL sum) {int u = findhash(x);for(int i = head[u];i != -1;i = next[i]) if(val[i] == x) {cnt[i] += sum;return ;}val[E] = x;cnt[E] = sum;next[E] = head[u];head[u] = E++;}}biao1, biao2;int c[22], n, m, d[22];
//  编码
void get(LL x) {for(int i = m+1;i >= 1; i--) {c[i] = x&7;x /= 8;}
}
//  解码
LL getval() {LL ret = 0;for(int i = 1;i <= m+1; i++) {ret |= d[i];ret *= 8;}ret /= 8;return ret ;
}
//   转化成最小表示法
void change() {int vis[22];memset(vis, 0, sizeof(vis));int num = 1;for(int i = 1;i <= m+1;i ++) {if(!d[i])   continue;if(!vis[d[i]]) {vis[d[i]] = num;d[i] = num++;}else {d[i] = vis[d[i]];}}
}void fuzhi() {for(int i = 1;i <= m+1;i ++)    d[i] = c[i];
}char s[22][22];int main() {int i, j, k, l;while(scanf("%d%d", &n, &m) != -1) {for(i = 1;i <= n; i++)scanf("%s", s[i]+1);int tot = 0;for(i = 1;i <= n; i++)for(j = 1;j <= m; j++)if(s[i][j] == '.')  tot++;if(tot%2==1 || tot < 4) {puts("0");continue;}int tox  = -1, toy = -1;for(i = 1;i <= n; i++)for(j = 1;j <= m; j++) if(s[i][j] == '.') {tox = i;toy = j;}biao1.init();biao1.add(0, 1);LL ans = 0;for(i = 1;i <= n; i++){for(j = 0;j <= m; j++){biao2.init();for(l = 0;l < biao1.E; l++)  {get(biao1.val[l]);if(j == m) {for(int ii = 2;ii <= m+1; ii++) d[ii] = c[ii-1];d[1] = 0;change();LL now = getval();biao2.add(now, biao1.cnt[l]);continue;}if(c[j+1] && !c[j+2]) {  //  有左插头无上插头if(s[i][j+1] != '.')  continue;if(j+2 <= m) {fuzhi();d[j+1] = 0;d[j+2] = c[j+1];change();LL now = getval();biao2.add(now, biao1.cnt[l]);}if(i < n) {fuzhi();change();LL now = getval();biao2.add(now, biao1.cnt[l]);}}else if(!c[j+1] && c[j+2]) {  //  有上插头无左插头if(s[i][j+1] != '.')  continue;if(i < n) {fuzhi();d[j+1] = c[j+2]; d[j+2] = 0;change();LL now = getval();biao2.add(now, biao1.cnt[l]);}if(j+2 <= m) {fuzhi();change();LL now = getval();biao2.add(now, biao1.cnt[l]);}}else if(!c[j+1] && !c[j+2]) { //   左和上都无插头if(s[i][j+1] != '.') {fuzhi();change();LL now = getval();biao2.add(now, biao1.cnt[l]);continue;}if(j+2 <= m && i < n) {fuzhi();d[j+1] = d[j+2] = 13;change();LL now = getval();biao2.add(now, biao1.cnt[l]);}}else { //  左和上都有插头 ,  要判断左和上插头是否连通if(c[j+2] == c[j+1]) {int tot = 0;for(int ii = 1;ii <= m+1; ii++) if(c[ii])tot++;if(tot == 2 && i == tox && j+1 == toy) ans += biao1.cnt[l];}else {if(s[i][j+1] != '.')    continue;fuzhi();for(int ii = 1;ii <= m+1; ii++) if(ii != j+1 && ii != j+2 && d[ii] == d[j+1]) {d[ii] = d[j+2];break;}d[j+1] = d[j+2] = 0;change();LL now = getval();biao2.add(now, biao1.cnt[l]);}}}biao1 = biao2;}}printf("%I64d\n", ans);}return 0;
}


 


 

转载于:https://www.cnblogs.com/jiangu66/p/3236833.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/474107.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

TCP的2MSL问题

2MSL (Maximum SegmentLifetime) TIME_WAIT状态的存在有两个理由&#xff1a; 让4次挥手关闭流程更加可靠&#xff1b;4次挥手的最后一个ACK是是由主动关闭方发送出去的&#xff0c;若这个ACK丢失&#xff0c;被动关闭方会再次发一个FIN过来。若主动关闭方能够保持一个2MSL的TI…

LeetCode 1577. 数的平方等于两数乘积的方法数(双指针)

文章目录1. 题目2. 解题1. 题目 给你两个整数数组 nums1 和 nums2 &#xff0c;请你返回根据以下规则形成的三元组的数目&#xff08;类型 1 和类型 2 &#xff09;&#xff1a; 类型 1&#xff1a;三元组 (i, j, k) &#xff0c;如果 nums1[i]2 nums2[j] * nums2[k] 其中 0…

LeetCode 1578. 避免重复字母的最小删除成本

文章目录1. 题目2. 解题1. 题目 给你一个字符串 s 和一个整数数组 cost &#xff0c;其中 cost[i] 是从 s 中删除字符 i 的代价。 返回使字符串任意相邻两个字母不相同的最小删除成本。 请注意&#xff0c;删除一个字符后&#xff0c;删除其他字符的成本不会改变。 示例 1&…

hdu2709 Sumsets 递推

题目链接&#xff1a;http://acm.hdu.edu.cn/showproblem.php?pid2709 感觉很经典的一道递推题 自己想了有半天的时间了。。。。比较弱。。。。 思路&#xff1a; 设f[n]表示和为n的组合数&#xff1b; 那么 当n为奇数时&#xff0c;很简单&#xff0c;相当于在f[n-1]的每一个…

python入门字符串

python 字符串str&#xff0c; ‘’, ‘’ ‘’, ‘’’ ‘’’;python没有字符&#xff0c;只有字符串hh 切片 字符串不可以修改&#xff0c;修改的话&#xff0c;类似于tuple, 修改的话&#xff0c; 只可以整体修改 tuple 也是可这样&#xff0c; 确切的说只是修改了指针…

python 经典100例(1-20)

【程序1】题目&#xff1a;有1、2、3、4个数字&#xff0c;能组成多少个互不相同且无重复数字的三位数&#xff1f;都是多少&#xff1f;1.程序分析&#xff1a;可填在百位、十位、个位的数字都是1、2、3、4。组成所有的排列后再去掉不满足条件的排列。 2.程序源代码&#xff1…

go ioc三方库推荐

在 Go 语言中&#xff0c;没有像 Spring Boot 这样的完整的 IOC&#xff08;Inversion of Control&#xff09;框架。Go 语言的设计哲学更倾向于简洁、轻量级的解决方案&#xff0c;没有像 Java 的 Spring Framework 这样重量级的 IOC 容器。 然而&#xff0c;Go 社区中有一些…

统一编址 独立编址 寻址空间

概念 存储器统一编址,即从存储空间中划出一部分地址给I/O端口。CPU访问端口和访问存储器的指令在形式上完全相同&#xff0c;只能从地址范围来区分两种操作。优点 对端口操作的指令类型多&#xff0c;功能全&#xff0c;不仅能对端口进行数据传送&#xff0c;还可以对端口内容进…

阿里云 超级码力在线编程大赛初赛 第4场 题目3. from start to end

文章目录1. 题目2. 解题1. 题目 样例1&#xff1a; 输入&#xff1a; "abcd" "bcda" 输出&#xff1a; true样例2&#xff1a; 输入&#xff1a; "abcd" "abdc" 输出&#xff1a; false来源&#xff1a;https://tianchi.aliyun.com/oj…

Codeforces Round #697 (Div.3) A~G解题报告与解法证明

题目大体概括 A #include <cstdio> #include <cstring> #include <algorithm> #include <iostream> using namespace std;typedef long long LL; const int N 500; LL a[N]; int sz; bool Check(LL n) {for (int i 0; i < sz; i ){if (n a[i])…

python网络编辑 socket篇

Python之路&#xff1a; socket篇 Socket 网络上的两个程序通过一个双向的通信连接实现数据的交换&#xff0c;这个连接的一端称为一个socket&#xff0c;作为BSD UNIX的进程通信机制&#xff0c;通常也称做“套接字” &#xff0c;是一个通信链的句柄&#xff0c;实现不同程序…

java获取插入数据库表中的自增列值的一个简单方法

PreparedStatement ps conn.prepareStatement(sql,Statement.RETURN_GENERATED_KEYS); // 第一步 ps.executeUpdate(); //第二步 ResultSet rs ps.getGeneratedKeys(); //获取 rs.next(); int id rs.getInt(1); 转载于:https://www.cnblogs.com/blogyuan/p/3739657…

Codeforces Round #698 (Div. 2) A-E解题报告与解法证明

Codeforces Round #698 (Div. 2) A-E解题报告与解法证明 题目解法总体概括 A Nezzar and Colorful Balls #include <bits/stdc.h> using namespace std;const int N 110; int a[N], f[N];int main() {int t; cin >> t;while (t -- ){static int n;scanf("%…

python开始之路—基础中的基础

python之路&#xff1a; 基础篇 一、Python 1、python是怎么来的 是在1989年吉多范罗苏姆&#xff0c;在圣诞节的时候闲着无聊自己用C语言开发的&#xff0c;一个脚本解释程序&#xff0c;作为ABC语言的一种继承。 2、有哪些公司在用 Youtube、Dropbox、BT、Quor…

关于malloc与字符指针的一些易错点

有如下一段代码&#xff0c;意图把“zhongxiaoming"字符串赋值进以p为首地址的空间为15字节的内存空间&#xff0c;然后释放p所指向的内存&#xff0c;以免出现内存泄露。 该代码出现几个问题&#xff0c;涉及到内存的赋值、malloc函数以及free函数的用法&#xff0c;以及…

第八届“图灵杯”NEUQ-ACM程序设计竞赛个人赛(同步赛)解题报告

第八届“图灵杯”NEUQ-ACM程序设计竞赛个人赛&#xff08;同步赛&#xff09; 题目总结 A题 切蛋糕 题目信息 解题思路 如果我们将 1/k展开到二进制的形式&#xff0c;那么就可以计算出 需要 多少块1/(2^i) 蛋糕&#xff0c;因此就可以创建出分割的方案&#xff0c;最后进行…

02.改善深层神经网络:超参数调试、正则化以及优化 W2.优化算法

文章目录1. Mini-batch 梯度下降2. 理解 mini-batch 梯度下降3. 指数加权平均数4. 理解指数加权平均数5. 指数加权平均的偏差修正6. 动量Momentum梯度下降法7. RMSprop8. Adam 优化算法9. 学习率衰减10. 局部最优的问题作业参考&#xff1a; 吴恩达视频课 深度学习笔记 1. Min…

PowerDesigner建数据库模型增加自定义扩展属性

PowerDesigner自7.x新增加一个特性&#xff0c;就是允许用户通过扩展模型的方式扩展模型的属性,但到底怎用一直搞不清楚&#xff0e;今天和同事商量准备直接在程序的Metadata信息实现上直接使用pdm时&#xff0c;我们需要对其进行扩展&#xff0c;因此又碰到这个问题&#xff0…

python初级进阶篇

python之路&#xff1a;进阶篇 一、作用域 在Python 2.0及之前的版本中&#xff0c;Python只支持3种作用域&#xff0c;即局部作用域&#xff0c;全局作用域&#xff0c;内置作用域&#xff1b;在Python 2.2中&#xff0c;Python正式引入了一种新的作用域 --- 嵌套作用域&#…

Educational Codeforces Round 103 (Rated for Div. 2)A~E解题报告

Educational Codeforces Round 103 (Rated for Div. 2) A. K-divisible Sum 原题信息 解题思路 AC代码 #include <bits/stdc.h> using namespace std;typedef long long LL; const int N 100010;int main() {int t; cin >> t;while (t -- ){static LL n, k;sc…