HPU1280 迷上象棋的HH【DP】

1280: 迷上象棋的HH

Time Limit: 1 Sec  Memory Limit:
128 MB

Submit: 9  Solved: 2

[Submit][Status][Web
Board
] [Edit]

Description

HH最近迷上了中国象棋,如图,A 点有一个过河卒,需要走到目标 B 点。卒行走规则:可以向下、或者向右。同时在棋盘上的任一点有一个对方的马(如上图的C点),该马所在的点和所有跳跃一步可达的点称为对方马的控制点。例如上图 C 点上的马可以控制 9 个点(图中的P1,P2 … P8 和 C)。卒不能通过对方马的控制点。

棋盘用坐标表示,A 点(0,0)、B 点(n,m)(n,m 为不超过 20 的整数,并由键盘输入),同样马的位置坐标是需要给出的(约定: C<>A,同时C<>B)。现在要求你计算出卒从 A 点能够到达 B 点的路径的条数。

Input

键盘输入

B点的坐标(n,m)以及对方马的坐标(X,Y){不用盘错}

Output

屏幕输出

一个整数(路径的条数)。

Sample Input

6 6 3 2

Sample Output

17

HINT

Source

河南理工大学第五届ACM程序设计竞赛

比赛时开始用深搜,TLE了,后来看出来是数塔变形,就直接用数塔的方法过了

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

typedef long long LL;

LL dp[22][22];
int n, m, x, y;

int main() {
    // freopen("stdin.txt", "r", stdin);
    int i, j;
    while (scanf("%d%d%d%d", &n, &m, &x, &y) != EOF) {
        memset(dp, 0, sizeof(dp));
        dp[0][0] = 1;
        for (i = 0; i <= n; ++i)
            for (j = 0 ; j <= m; ++j) {
                if(i == x && j == y || abs(i-x) == 2 && abs(j-y) == 1 || abs(i-x) == 1 && abs(j-y) == 2)
                    continue;
                else {
                    if (i) dp[i][j] = dp[i-1][j];
                    if (j) dp[i][j] += dp[i][j-1];
                }
            }
        printf("%lld\n", dp[n][m]);
    }
    return 0;
}
时间: 2024-10-05 18:05:01

HPU1280 迷上象棋的HH【DP】的相关文章

SPOJ GNYR09F 数字上的找规律DP

Problem C      SPOJ GNYR09F dp题,dp可能刚刚开始对大家来说比较难,但是静下心来分析还是比较简单的: dp(i ,j ,k)表示前i个数中,当前累积和为j,末尾数字为k的方案数. 考虑第i个位置的2种情况: 1.放0:dp(i,j,0) = dp(i-1,j,0) + dp(i-1,j,1) 2.放1:dp(i,j,1)= dp(i-1,j,0) 因为每一行最开始的状态均从i=j+1,dp(i,j,0)=0,dp(i,j,1)=1开始的,但因为这样子开头均为1,那些

综合第一篇(迷上了Quora)

初春三月,今年的春节过后已经是三月份了.再一次踏上异乡奔波的路途,我是一个人们俗称的屌丝程序猿,普通的再也不能普通了的那种.我也经常梦想自己成为了一个技术大牛,在自己的熟悉的技术领域侃侃而谈.duang~ 不过现在还是现在,办公室外的阳光正好斜入我的办公桌,照在大Mac上. 不过我还是有计划,有梦想,会努力的屌丝.想很多怀揣梦想的青年一样,过着苦逼的日子,规划着未来幸福的生活.平时,关注了很多技术大牛的博客或者是公众号(在我上大学的时候,还没有这个家伙),接触Quora是无意间,当时是丰富自己的

AcWing 306. 杰拉尔德和巨型象棋 计数类DP

参考秦大佬的题解: https://www.acwing.com/solution/AcWing/content/1730/ //通过容斥原理 //那么F[i]表示为从左上角走到第i个黑色格子,而且途中不经过其他黑色格子的方案数 //终点作为第k+1个黑格子 //F[i]=(1,1)到(xi,xj)的总方案数-前(i-1)黑格方案数*黑格到(xi,yi)的方案数 //其中, (1,1)到(xi,xj)的总方案数为C(xi-1+yi-1,xi-1) #include<iostream> #inc

bzoj1801: [Ahoi2009]chess 中国象棋 [dp]

Description 在N行M列的棋盘上,放若干个炮可以是0个,使得没有任何一个炮可以攻击另一个炮. 请问有多少种放置方法,中国像棋中炮的行走方式大家应该很清楚吧. Input 一行包含两个整数N,M,中间用空格分开. Output 输出所有的方案数,由于值比较大,输出其mod 9999973 Sample Input 1 3 Sample Output 7 HINT 除了在3个格子中都放满炮的的情况外,其它的都可以. 100%的数据中N,M不超过10050%的数据中,N,M至少有一个数不超过

UVa1025 (DAG上的dp)

这是紫书上的第一个dp哈. 1.状态定义:dp[i][j]---->到时刻i的时候(出发的时候时刻为0,约定时间为时刻time),从j号车站开往N号车站,在车站等待的最少的时间. 2.这个人当前的策略: α.在车站等待一个单位的时间(该站此时没有发车时应该这么做) β.坐上开往左边的火车 γ.坐上开往右边的火车 3.状态转移方程:dp[i][j] = min(dp[i+1][j]+1,dp[i+t[j]][j+1],dp[i+t[j-1]][j-1]) 我们可以做一个乘车时刻表来记录i时刻j车站

洛谷OJ 2051 中国象棋 DP(计数)

https://www.luogu.org/problem/show?pid=2051 题意:n*m棋盘,n,m<=100 问在棋盘上放炮 使得任意两个炮都互补攻击(即同行或者同列最多放两个)的方法数? 定义状态,dp[i][j][k] 已经放了i行 有j列放一个炮,有k列放2个炮 (并不需要准确知道当前棋盘的状态)状态转移时,按照第i行如何放炮即可 #include <bits/stdc++.h> using namespace std; typedef long long ll; c

fzu2172 字符串dp

F - 巡了南山我巡北山 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Practice FZU 2172 Description 大师兄在取经途中迷上了ACM-ICPC,稍不留神,师傅就被妖怪抓走了. 大师兄并不着急去救师傅,在虐这道简单题: 有两个字符串A和B,每一次可以选择以下操作中的一种,只对字符串A进行操作,用最少的操作使得字符串A与字符串B相等: 在

tyvj P1519 博彩游戏(AC自动机+DP滚动数组)

P1519 博彩游戏 背景 Bob最近迷上了一个博彩游戏…… 描述 这个游戏的规则是这样的:每花一块钱可以得到一个随机数R,花上N块钱就可以得到一个随机序列:有M个序列,如果某个序列是产生的随机序列的子串,那么就中奖了,否则不中.Bob会告诉你这M个序列,和身上有的钱的总数N,当然还有R的范围.请你告诉Bob中奖的概率有多少? 输入格式 第一行三个用空格隔开的数N.M和R的范围R.其中1<=R<=9,0<N<=60,0<M<=20000.下面M行每行一个字符串(长度小于

BZOJ 1855 股票 单调队列优化dp

1855: [Scoi2010]股票交易 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 909  Solved: 420[Submit][Status][Discuss] Description 最近lxhgww又迷上了投资股票,通过一段时间的观察和学习,他总结出了股票行情的一些规律. 通过一段时间的观察,lxhgww预测到了未来T天内某只股票的走势,第i天的股票买入价为每股APi,第i天的股票卖出价为每股BPi(数据保证对于每个i,都有APi>=B