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 & 前缀和 & 数学)的更多相关文章

  1. HDU - 5550 Game Rooms 【DP+前缀和】

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=5550 题意 一撞大楼有N层楼,然后每层楼都有一部分人喜欢打羽毛球,一部分人喜欢打乒乓球 但是每层楼只能 ...

  2. HDU 5550 - Game Rooms(DP + 前缀和预处理)

    链接: http://acm.hdu.edu.cn/showproblem.php?pid=5550 题意: 一个大楼有n(2≤n≤4000)层,每层可以建一个乒乓球房或者一个游泳房,且每种房间在大楼 ...

  3. HDU 6092:Rikka with Subset(dp)

    分析 很多个较小的数字可以随机组合成较大的数字,所以B数组从小到大开始遍历,除了空集,最小的那个存在的个数对应的数字必然是a数组中的数字. 每求出这一部分之后,更新后续的B序列. 分析完后,主要的难点 ...

  4. HDU 2829 区间DP & 前缀和优化 & 四边形不等式优化

    HDU 2829 区间DP & 前缀和优化 & 四边形不等式优化 n个节点n-1条线性边,炸掉M条边也就是分为m+1个区间 问你各个区间的总策略值最少的炸法 就题目本身而言,中规中矩的 ...

  5. HDU 6091 - Rikka with Match | 2017 Multi-University Training Contest 5

    思路来自 某FXXL 不过复杂度咋算的.. /* HDU 6091 - Rikka with Match [ 树形DP ] | 2017 Multi-University Training Conte ...

  6. HDU 5831 Rikka with Parenthesis II(六花与括号II)

    31 Rikka with Parenthesis II (六花与括号II) Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536 ...

  7. HDU 1003 Max Sum --- 经典DP

    HDU 1003    相关链接   HDU 1231题解 题目大意:给定序列个数n及n个数,求该序列的最大连续子序列的和,要求输出最大连续子序列的和以及子序列的首位位置 解题思路:经典DP,可以定义 ...

  8. 判断相同区间(lazy) 多校8 HDU 5828 Rikka with Sequence

    // 判断相同区间(lazy) 多校8 HDU 5828 Rikka with Sequence // 题意:三种操作,1增加值,2开根,3求和 // 思路:这题与HDU 4027 和HDU 5634 ...

  9. hdu 5094 Maze 状态压缩dp+广搜

    作者:jostree 转载请注明出处 http://www.cnblogs.com/jostree/p/4092176.html 题目链接:hdu 5094 Maze 状态压缩dp+广搜 使用广度优先 ...

随机推荐

  1. hibernate 单元测试

     单元测试 测试 dao service action package com.kaishengit.test; import org.hibernate.Session; import com.ka ...

  2. 分布式爬虫搭建系列 之一------python安装及以及虚拟环境的配置及scrapy依赖库的安装

    python及scrapy框架依赖库的安装步骤: 第一步,python的安装 在Windows上安装Python 首先,根据你的Windows版本(64位还是32位)从Python的官方网站下载Pyt ...

  3. Ok6410裸机驱动学习(三)C语言内嵌汇编

    1.C语言内嵌汇编使用方法 C内嵌汇编以关键字”_asm_或asm开始,下辖4个部分,各部分之间用“:”分开,第一部分是必须写的,后面3个部分可以省略,但是分号:不能省略 优化后的代码 2.汇编程序框 ...

  4. http协议基础教程

    引言 HTTP 是一个属于应用层的面向对象的协议,由于其简捷.快速的方式,适用于分布式超媒体信息系统.它于1990年提出,经过几年的使用与发展,得到不断地完善和 扩展.目前在WWW中使用的是HTTP/ ...

  5. Oracle之DBMS_SQL包用法详解

    对于一般的(select)操作,如果使用动态的sql语句则需要进行以下几个步骤:open  cursor--->parse---> bind  variable  ---> defi ...

  6. actionbar中添加searchview并监听期伸缩/打开的方法

    首先在xml中设置actionviewclass <item android:id="@+id/m1" android:title="setting" a ...

  7. 静态页面HTML中标签的优化(转)

    静态页面HTML中标签的优化 (2010-04-03 20:54:06) 标签: 电脑 name 罗马数字 css 表单 杂谈 分类: 网页制作 从网上看了一篇关于静态页面中标签优化的问题,感觉还不错 ...

  8. Codeforces 1137C Museums Tour (强连通分量, DP)

    题意和思路看这篇博客就行了:https://www.cnblogs.com/cjyyb/p/10507937.html 有个问题需要注意:对于每个scc,只需要考虑进入这个scc的时间即可,其实和从哪 ...

  9. sleep()和usleep()

    函数名: sleep头文件: #include <windows.h> // 在VC中使用带上头文件        #include <unistd.h>  // 在gcc编译 ...

  10. 算法Sedgewick第四版-第1章基础-023-MultiwordSearch.java

    Multi-word search. Program MultiwordSearch.java reads a sequence of query words q[1], ..., q[k] from ...