小a和uim之大逃离(luogu P1373 dp)

给你一个n*m的矩阵,其中元素的值在1~k内。限制只能往下和往右走,问从任意点出发,到任意点结束,且经过了偶数个元素的合法路径有多少个。在此题中,定义在一条路径中,第奇数个元素之和为X,第偶数个元素之和为Y。X+Y同模k+1的路径是合法路径。答案模1e9+7。n,m<=800,1<=k<=15。

状态是\(f[i][j][h][0/1]\),表示第i行第j列的元素,奇数元素和X-偶数元素和Y差为h,当前在路径中是第奇数个点或第偶数个点的方案数。

设\(p1=(p-a[j]+k+1)\% (k+1)\),\(p2=(p+a[j])\%(k+1)\)。那么状态转移方程就是:$$f[i][j][p][0]=f[i][j-1][p1][1]+f[i-1][j][p1][1]+(p1?0:1)$$$$f[i][j][p][1]=f[i][j-1][p2][0]+f[i-1][j][p2][0]$$

状压一下即可。

#include <cctype>
#include <cstdio>
#include <cstring>
using namespace std; const int mod=1e9+7;
const int maxn=805, maxk=20;
typedef int ia3[maxn][maxk][2];
int n, m, k, ans, a[maxn];
ia3 fnow, fpre; void getint(int &x){
char ch; int flag=1; x=0;
for (ch=getchar(); !isdigit(ch); ch=getchar())
if (ch=='-') flag=-1;
for (x=ch-48; ch=getchar(), isdigit(ch);)
x=x*10+ch-48;
x*=flag;
} int main(){
scanf("%d%d%d", &n, &m, &k);
int p1, p2;
for (int i=1; i<=n; ++i)
for (int j=1; j<=m; ++j){
getint(a[j]);
for (int p=0; p<=k; ++p){
p1=(p-a[j]+k+1)%(k+1); //这一步若小A走
p2=(p+a[j])%(k+1); //这一步若uim走
fnow[j][p][0]=(fnow[j-1][p1][1]
+fpre[j][p1][1]+(p1?0:1))%mod;
fnow[j][p][1]=(fnow[j-1][p2][0]
+fpre[j][p2][0])%mod;
if (p==0) ans=(ans+fnow[j][p][1])%mod;
}
memcpy(fpre[j], fnow[j], sizeof(fnow[j]));
}
printf("%d\n", ans);
return 0;
}

小a和uim之大逃离(luogu P1373 dp)的更多相关文章

  1. 洛谷 P1373 小a和uim之大逃离 Label:dp 不会

    题目背景 小a和uim来到雨林中探险.突然一阵北风吹来,一片乌云从北部天边急涌过来,还伴着一道道闪电,一阵阵雷声.刹那间,狂风大作,乌云布满了天空,紧接着豆大的雨点从天空中打落下来,只见前方出现了一个 ...

  2. P1373 小a和uim之大逃离 二维dp

    题目背景 小a和uim来到雨林中探险.突然一阵北风吹来,一片乌云从北部天边急涌过来,还伴着一道道闪电,一阵阵雷声.刹那间,狂风大作,乌云布满了天空,紧接着豆大的雨点从天空中打落下来,只见前方出现了一个 ...

  3. 【题解】洛谷P1373 小a和uim之大逃离(坐标DP)

    次元传送门:洛谷P1373 思路 设f[i][j][t][1/0]表示走到(i,j)时 小a减去uim的差值为t 当前是小a取(0) uim取(1) 那么转移就很明显了 f[i][j][t][]=(f ...

  4. 洛谷P1373 小a和uim之大逃离【线性dp】

    题目:https://www.luogu.org/problemnew/show/P1373 题意: 有一个n*m的地图,每个点上有一个数值.两个人在任一点开始任一点结束,只能往右或往下走,轮流收集数 ...

  5. luogu1373_小a和uim之大逃离 多维dp

    传送门 巧妙之处在于dp的设计只用设计差值即可,因此不会mle,枚举的顺序问题也解决了 #include <bits/stdc++.h> using namespace std; #def ...

  6. 【题解】 P1373 小a和uim之大逃离

    题解 P1373 小a和uim之大逃离 传送门 一道dp好题 乍看此题,感觉要这样设计: \(dp(x)(y)(mod_{a})(mod_{uim})(0/1)\) , 但是我上午考试就MLE了,赶紧 ...

  7. 洛谷1373 小a和uim之大逃离

    洛谷1373 小a和uim之大逃离 本题地址:http://www.luogu.org/problem/show?pid=1373 题目背景 小a和uim来到雨林中探险.突然一阵北风吹来,一片乌云从北 ...

  8. P3818 小A和uim之大逃离 II(洛谷月赛)

    P3818 小A和uim之大逃离 II 题目背景 话说上回……还是参见 https://www.luogu.org/problem/show?pid=1373 吧 小a和uim再次来到雨林中探险.突然 ...

  9. luogu- P1373 小a和uim之大逃离 DP 四维,其中一维记录差值

    P1373 小a和uim之大逃离: https://www.luogu.org/problemnew/show/P1373 题意: 在一个矩阵中,小A和小B轮流取数,小A可以从任意点先取,小B后取,最 ...

随机推荐

  1. 取得微信用户OpenID

    公司需要微信这个平台和用户交流,于是开始研究微信公众平台.微信公众平台分为两种模式,其一是编辑模式,比如用户发什么内容,你可以响应什么内容.另外一种便是开发模式,这个模式功能丰富,不仅仅可以获取到用户 ...

  2. springMvc 4.0 jackson包改变

    使用之前的json包出包java.lang.NoClassDefFoundError: com/fasterxml/jackson/core/JsonProcessingException错误. sp ...

  3. div中p标签自动换行

    只需要设置div的width属性,p标签加上word-break:break-word属性就会自动换行 ----------------2016.7.1-------------------- 今天在 ...

  4. Java for LeetCode 120 Triangle

    Given a triangle, find the minimum path sum from top to bottom. Each step you may move to adjacent n ...

  5. centos 7 部署 mysql 报错记录

    1. Header V3 DSA/SHA1 Signature, key ID 5072e1f5: NOKEY 这是由于yum安装了旧版本的GPG keys造成的,解决办法就是 引用  rpm --i ...

  6. JAVA- String类练习

    JAVA- String类练习 需求1:去除字符串两边空格的函数,写一个自己的trim(); public class TestTrim { public static void main(Strin ...

  7. 草原psd素材

    草原PSD素材,草原,风景,蓝天白云,飞鸟,阳光,绿色,草地. http://www.huiyi8.com/caoyuan/psd/

  8. ffmpeg截取视频

    ffmpeg -i ./suen071520.mp4 -vcodec copy -acodec copy -ss 00:55:00 -to 01:14:50 ./suen071520sp3.mp4-- ...

  9. 阿里大于短信服务_异常_01_InvalidTimeStamp.Expired

    一.异常信息 dm.aliyuncs.com InvalidTimeStamp.Expired Specified time stamp or date value is expired. 二.异常原 ...

  10. install docker

    摘要: 我的环境是:CentOS-7-x86_64-Minimal-1511.iso , 也可参考docker官网文档,来安装, url : https://docs.docker.com/engin ...