HDU - 6416 :Rikka with Seam(DP & 前缀和 & 数学)
pro:给定N*M的矩阵,现在让你在每一行删去一个位置,然后形成新N*(M-1)的矩阵,问有多少种不同的新的矩阵。需要满足相邻行删去的位置不大于K。
(题目是01矩阵,其实任意矩阵都可以做,本题算法里只关心相邻的是否相同。
sol:dp[i][j]表示从上到下删,删到第i行,第i行删去第j列的不同矩阵方案数。
再用一个same数组去重,same[i][j]表示dp[i][j]和dp[i][j-1]的共同部分,即a[i][j]=a[i][j-1]的公共来源部分。
一直维护dp和same数组即可。
详解请移步:https://blog.csdn.net/CatDsy/article/details/81876341
#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
const int maxn=;
const int Mod=;
int dp[maxn][maxn],same[maxn][maxn];
int sum1[maxn][maxn],sum2[maxn][maxn];
char c[maxn][maxn];
int main()
{
int T,N,M,K,ans;
scanf("%d",&T);
while(T--){
scanf("%d%d%d",&N,&M,&K);
rep(i,,N) scanf("%s",c[i]+);
rep(i,,M) {
dp[][i]=;
same[][i]=(i!=&&c[][i]==c[][i-]);
sum1[][i]=sum1[][i-]+dp[][i];
sum2[][i]=sum2[][i-]+same[][i];
}
rep(i,,N){
rep(j,,M) {
dp[i][j]=((sum1[i-][min(M,j+K)]-sum1[i-][max(,j-K-)])%Mod+Mod)%Mod-((sum2[i-][min(M,j+K)]-sum2[i-][max(,j-K)])%Mod+Mod)%Mod;
if(dp[i][j]<) dp[i][j]+=Mod;
if(j==||c[i][j]!=c[i][j-]) same[i][j]=;
else same[i][j]=((sum1[i-][min(M,j+K-)]-sum1[i-][max(,j-K-)])%Mod+Mod)%Mod-((sum2[i-][min(M,j+K-)]-sum2[i-][max(,j-K)])%Mod+Mod)%Mod;
if(same[i][j]<) same[i][j]+=Mod;
sum1[i][j]=(sum1[i][j-]+dp[i][j])%Mod;
sum2[i][j]=(sum2[i][j-]+same[i][j])%Mod;
}
}
ans=;
rep(i,,M) ans=((ans+(dp[N][i]-same[N][i])%Mod)%Mod+Mod)%Mod;
printf("%d\n",ans);
}
return ;
}
HDU - 6416 :Rikka with Seam(DP & 前缀和 & 数学)的更多相关文章
- HDU - 5550 Game Rooms 【DP+前缀和】
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=5550 题意 一撞大楼有N层楼,然后每层楼都有一部分人喜欢打羽毛球,一部分人喜欢打乒乓球 但是每层楼只能 ...
- HDU 5550 - Game Rooms(DP + 前缀和预处理)
链接: http://acm.hdu.edu.cn/showproblem.php?pid=5550 题意: 一个大楼有n(2≤n≤4000)层,每层可以建一个乒乓球房或者一个游泳房,且每种房间在大楼 ...
- HDU 6092:Rikka with Subset(dp)
分析 很多个较小的数字可以随机组合成较大的数字,所以B数组从小到大开始遍历,除了空集,最小的那个存在的个数对应的数字必然是a数组中的数字. 每求出这一部分之后,更新后续的B序列. 分析完后,主要的难点 ...
- HDU 2829 区间DP & 前缀和优化 & 四边形不等式优化
HDU 2829 区间DP & 前缀和优化 & 四边形不等式优化 n个节点n-1条线性边,炸掉M条边也就是分为m+1个区间 问你各个区间的总策略值最少的炸法 就题目本身而言,中规中矩的 ...
- HDU 6091 - Rikka with Match | 2017 Multi-University Training Contest 5
思路来自 某FXXL 不过复杂度咋算的.. /* HDU 6091 - Rikka with Match [ 树形DP ] | 2017 Multi-University Training Conte ...
- HDU 5831 Rikka with Parenthesis II(六花与括号II)
31 Rikka with Parenthesis II (六花与括号II) Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536 ...
- HDU 1003 Max Sum --- 经典DP
HDU 1003 相关链接 HDU 1231题解 题目大意:给定序列个数n及n个数,求该序列的最大连续子序列的和,要求输出最大连续子序列的和以及子序列的首位位置 解题思路:经典DP,可以定义 ...
- 判断相同区间(lazy) 多校8 HDU 5828 Rikka with Sequence
// 判断相同区间(lazy) 多校8 HDU 5828 Rikka with Sequence // 题意:三种操作,1增加值,2开根,3求和 // 思路:这题与HDU 4027 和HDU 5634 ...
- hdu 5094 Maze 状态压缩dp+广搜
作者:jostree 转载请注明出处 http://www.cnblogs.com/jostree/p/4092176.html 题目链接:hdu 5094 Maze 状态压缩dp+广搜 使用广度优先 ...
随机推荐
- hibernate 单元测试
单元测试 测试 dao service action package com.kaishengit.test; import org.hibernate.Session; import com.ka ...
- 分布式爬虫搭建系列 之一------python安装及以及虚拟环境的配置及scrapy依赖库的安装
python及scrapy框架依赖库的安装步骤: 第一步,python的安装 在Windows上安装Python 首先,根据你的Windows版本(64位还是32位)从Python的官方网站下载Pyt ...
- Ok6410裸机驱动学习(三)C语言内嵌汇编
1.C语言内嵌汇编使用方法 C内嵌汇编以关键字”_asm_或asm开始,下辖4个部分,各部分之间用“:”分开,第一部分是必须写的,后面3个部分可以省略,但是分号:不能省略 优化后的代码 2.汇编程序框 ...
- http协议基础教程
引言 HTTP 是一个属于应用层的面向对象的协议,由于其简捷.快速的方式,适用于分布式超媒体信息系统.它于1990年提出,经过几年的使用与发展,得到不断地完善和 扩展.目前在WWW中使用的是HTTP/ ...
- Oracle之DBMS_SQL包用法详解
对于一般的(select)操作,如果使用动态的sql语句则需要进行以下几个步骤:open cursor--->parse---> bind variable ---> defi ...
- actionbar中添加searchview并监听期伸缩/打开的方法
首先在xml中设置actionviewclass <item android:id="@+id/m1" android:title="setting" a ...
- 静态页面HTML中标签的优化(转)
静态页面HTML中标签的优化 (2010-04-03 20:54:06) 标签: 电脑 name 罗马数字 css 表单 杂谈 分类: 网页制作 从网上看了一篇关于静态页面中标签优化的问题,感觉还不错 ...
- Codeforces 1137C Museums Tour (强连通分量, DP)
题意和思路看这篇博客就行了:https://www.cnblogs.com/cjyyb/p/10507937.html 有个问题需要注意:对于每个scc,只需要考虑进入这个scc的时间即可,其实和从哪 ...
- sleep()和usleep()
函数名: sleep头文件: #include <windows.h> // 在VC中使用带上头文件 #include <unistd.h> // 在gcc编译 ...
- 算法Sedgewick第四版-第1章基础-023-MultiwordSearch.java
Multi-word search. Program MultiwordSearch.java reads a sequence of query words q[1], ..., q[k] from ...