HDU 5617 Jam's maze dp+滚动数组
题目链接:
hdu: http://acm.hdu.edu.cn/showproblem.php?pid=5617
bc(中文):http://bestcoder.hdu.edu.cn/contests/contest_chineseproblem.php?cid=666&pid=1003
题解:
设dp[x1][x2][i]表示第i步时,从(1,1)点走到了(x1,y1),(n,n)点走到了(x2,y2)点的合法的总数。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std; const int maxn = ;
const int mod = ; int dp[maxn][maxn][];
char str[maxn][maxn]; int n; void init() {
memset(dp, , sizeof(dp));
} inline int add(int x, int y) {
x += y;
if (x > mod) x -= mod;
return x;
} int main() {
int tc;
scanf("%d", &tc);
while (tc--) {
init();
scanf("%d", &n);
for (int i = ; i <= n; i++) scanf("%s", str[i] + );
if (str[][] == str[n][n]) dp[][n][] = ;
//printf("dp[1][n][0]:%d\n", dp[1][n][0]);
int u = ;
for (int i = ; i <= n; i++) {
for (int j = ; j <= i; j++) {
for (int k = ; k <= i; k++) {
int x1, y1, x2, y2;
x1 = j; y1 = i + - x1;
x2 = n + - k; y2 = * n - i + - x2; //滚动数组非常需要注意的地方就是!!!每次都要初始化!!!初始化!!!初始化!!!
dp[x1][x2][u] = ; //if (i == n&&x1 != x2) continue; if (str[x1][y1] == str[x2][y2]) {
//printf("fuck!");
int &cur = dp[x1][x2][u];
cur = add(cur, dp[x1][x2][!u]);
cur = add(cur, dp[x1][x2 + ][!u]);
cur = add(cur, dp[x1 - ][x2][!u]);
cur = add(cur, dp[x1- ][x2 + ][!u]);
}
}
}
u = !u;
}
int ans = ;
for (int i = ; i <= n; i++) ans = add(ans, dp[i][i][!u]);
printf("%d\n", ans);
}
return ;
}
HDU 5617 Jam's maze dp+滚动数组的更多相关文章
- HDU 5617 Jam's maze 巧妙DP
题意:给你一个字符矩阵,从(1,1)到(n,n)有很多种走法,每一种走法形成一个字符串,问有多少种走法形成的字符串是回文的 分析:(粘贴BC题解) 的是回文串,有人会想到后缀数组自动机马拉车什么的,其 ...
- hdu 1513 && 1159 poj Palindrome (dp, 滚动数组, LCS)
题目 以前做过的一道题, 今天又加了一种方法 整理了一下..... 题意:给出一个字符串,问要将这个字符串变成回文串要添加最少几个字符. 方法一: 将该字符串与其反转求一次LCS,然后所求就是n减去 ...
- HDU - 4576 Robot(概率dp+滚动数组)
题意:所有的格子围成一个圈,标号为1~n,若从格子1出发,每次指令告知行走的步数,但可能逆时针也可能顺时针走,概率都是1/2,那么问走了m次指令后位于格子l~r(1≤l≤r≤n)的概率. 分析: 1. ...
- hdu Max Sum Plus Plus(dp+滚动数组)
原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1024 m为段,要深刻理解题意,并没有说是段与段要连接. 题解链接:http://blog.csdn.n ...
- HDU 1024 Max Sum Plus Plus --- dp+滚动数组
HDU 1024 题目大意:给定m和n以及n个数,求n个数的m个连续子系列的最大值,要求子序列不想交. 解题思路:<1>动态规划,定义状态dp[i][j]表示序列前j个数的i段子序列的值, ...
- HDU 5119 Happy Matt Friends (背包DP + 滚动数组)
题目链接:HDU 5119 Problem Description Matt has N friends. They are playing a game together. Each of Matt ...
- POJ 3666 Making the Grade (DP滚动数组)
题意:农夫约翰想修一条尽量平缓的路,路的每一段海拔是A[i],修理后是B[i],花费|A[i] – B[i]|,求最小花费.(数据有问题,代码只是单调递增的情况) #include <stdio ...
- USACO 2009 Open Grazing2 /// DP+滚动数组oj26223
题目大意: 输入n,s:n头牛 s个栅栏 输入n头牛的初始位置 改变他们的位置,满足 1.第一头与最后一头的距离尽量大 2.相邻两头牛之间的距离尽量满足 d=(s-1)/(n-1),偏差不超过1 3. ...
- hdu 4576 (简单dp+滚动数组)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4576 题意:给出1~n的环,m个操作,每次能顺时针或逆时针走w步,询问最后在l~r这段区间内概率.(1 ...
随机推荐
- MySQL5.5安装(Windows版本)
1. 官网下载mysql5.5 下载地址:http://dev.mysql.com/downloads/mysql/5.5.html#downloads 2. 安装mysql5.5(安装之前,请关闭杀 ...
- Centos7前后台运行jar包
方式一: java -jar lf-test-1.0-SNAPSHOT.jar 前台运行,当前ssh窗口被锁定,可按CTRL + C打断程序运行,或直接关闭窗口,程序退出. 方式二: java -ja ...
- Debian使用dpkg安装MySQL
说明 本文写于2017-10-03,使用MySQL 5.7,操作系统为64位 Debian GNU/Linux 8.6 (jessie). 安装 因apt仓库将mysql相关的包移除,需要自己去官网下 ...
- linux-VM无法连接mks套接字连接尝试次数太多
打开服务管理界面 将VM的服务都设为自动,并将其启动 在VM中重新打开虚拟机即可
- [Java算法分析与设计]--链式堆栈的设计
在上篇文章当中,我们实现了底层为数组的顺序栈.在我之前的文章中也提到过:以数组为数据结构基础在存储数据方面需要一整块连续的内存来存放数据,一旦遇到需要可以动态扩展的功能需求时如果数据量大可能会给虚拟机 ...
- java的三个体系
Java是由SunMicrosystems公司于1995年5月推出的Java面向对象程序设计语言和Java平台的总称.由JamesGosling和同事们共同研发,并在1995年正式推出. Java分为 ...
- 20155203 实验三《敏捷开发与XP实践》实验报告
20155203 实验三<敏捷开发与XP实践>实验报告 一.实验内容 在IDEA中使用工具(Code->Reformate Code)把下面代码重新格式化,再研究一下Code菜单,找 ...
- 学号20155311 2016-2017-2 《Java程序设计》第10周学习总结
学号20155311 2016-2017-2 <Java程序设计>第10周学习总结 教材学习内容总结 网络编程 网络编程就是在两个或两个以上的设备(例如计算机)之间传输数据 计算机网络 路 ...
- 20155315 2016-2017-2 《Java程序设计》第一周学习总结
教材学习内容总结 第一章中提到了Java的前世今生和三大平台,我了解到Java SE包括JVM,JRE,JDK和Java语言.java最基本的特性之一是"跨平台",这使得Java语 ...
- 【SQLSERVER】如何找出字符串中的数字
可以通过写自定义函数实现,以下提供两种思路来解决: 1.通过正则匹配,找到字符串中的数字,一个一个拼起来 /*方法一: 一个一个找出来*/ CREATE FUNCTION [dbo].[Fun_Get ...