炮(棋盘DP)

  一直以为自己写的就是状态压缩,结果写完才知道是个棋盘dp

  首先看一下题目

  嗯,象棋 ,还是只有炮的象棋

  对于方案数有几种,我第一个考虑是dfs,但是超时稳稳的,所以果断放弃

  然后记得以前有过和这个题差不多的dp题

  所以思路开始转向DP

  经仔细思考后 将棋盘的状态压为三维

  dp[i][k][j];

  i:棋盘的第几行  k:前i行有几列放了一个炮棋  j:前i行有几列放了两个炮棋

  因为炮会隔棋打,所以一列或者一行最多存在两个炮棋

  所以

  dp方程有6个元素:

  1:不放炮棋,所以方程为 dp[i][k][j]+=dp[i-1][k][j];

  2:往一个没有炮棋的列放一个炮棋,方程为dp[i][j][k]+=dp[i-1][k-1][j]*(m-k-j+1);

  3:往一个有一个炮棋的列放一个炮棋,方程为dp[i][j][k]+=dp[i-1][k+1][j-1]*(k+1);

  4:往一个有一个炮棋的列放一个炮棋同时往一个没有炮棋的列放一个炮棋,方程为dp[i][j][k]+=dp[i-1][k][j-1]*(k)*(m-j-k+1)/2;

  5:往一个有一个炮棋的列放一个炮棋同时往一个有一个炮棋的列放一个炮棋,方程为dp[i][k][j]+=(k+2)*(k+1)/2*dp[i-1][k+2][j-2];

  6:往一个没有炮棋的列放一个炮棋同时往一个没有炮棋的列放一个炮棋,方程为dp[i][k][j]+=(m-j-k+2)*(m-j-k+1)/2*dp[i-1][k-2][j];

  好了,现在可以贴代码了

  

#include<cstdio>
#include<iostream>

#define mod 999983

using namespace std;

int n,m;
long long int dp[101][101][101],ans=0;

int main()
{
    scanf("%d%d",&n,&m);
    dp[0][0][0]=1;
    for(int i=1;i<=n;i++)
    {
        for(int k=0;k<=m;k++)
        {
            for(int j=0;j<=m-k;j++)
            {
                dp[i][k][j]=dp[i-1][k][j];
                if(k) dp[i][k][j]+=(m-k-j+1)*dp[i-1][k-1][j]%mod;
                if(j&&k<m) dp[i][k][j]+=(k+1)*dp[i-1][k+1][j-1]%mod;
                if(k>1) dp[i][k][j]+=(m-j-k+2)*(m-j-k+1)/2*dp[i-1][k-2][j]%mod;
                if(j>1&&k<m-1) dp[i][k][j]+=(k+2)*(k+1)/2*dp[i-1][k+2][j-2]%mod;
                if(k&&j) dp[i][k][j]+=(m-j-k+1)*(k)*dp[i-1][k][j-1]%mod;
                dp[i][k][j]%=mod;
            }
        }
    }
    for(int i=0;i<=m;i++)
    {
        for(int j=0;j<=m-i;j++)
        {
            ans+=dp[n][i][j];
            ans%=mod;
        }
    }
    printf("%lld\n",ans);
    return 0;
}
时间: 2024-12-11 00:27:33

炮(棋盘DP)的相关文章

Nanami&#39;s Digital Board CodeForces - 434B (棋盘dp)

大意: 给定01矩阵, m个操作, 操作1翻转一个点, 操作2求边界包含给定点的最大全1子矩阵 暴力枚举矩形高度, 双指针统计答案 #include <iostream> #include <algorithm> #include <math.h> #include <cstdio> #include <set> #include <map> #include <string> #include <vector>

codevs——1169 传纸条(棋盘DP)

2008年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 查看运行结果 题目描述 Description 小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题.一次素质拓展活动中,班上同学安排做成一个m行n列的矩阵,而小渊和小轩被安排在矩阵对角线的两端,因此,他们就无法直接交谈了.幸运的是,他们可以通过传纸条来进行交流.纸条要经由许多同学传到对方手里,小渊坐在矩阵的左上角,坐标(1,1),小轩坐在矩阵的右下角,坐标(m,

hdu2067 小兔的棋盘 DP/数学/卡特兰数

棋盘的一角走到另一角并且不越过对角线,卡特兰数,数据量小,可以当做dp求路径数 1 #include<stdio.h> 2 long long a[36][36]; 3 int main() 4 { 5 int n,count=0; 6 while (scanf("%d",&n)!=EOF&&n!=-1) 7 { 8 int i,j; 9 long long s; 10 count++; 11 for (i=1;i<=n;i++) a[0][i

1219 骑士游历(棋盘DP)

1997年 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description 设有一个n*m的棋盘(2≤n≤50,2≤m≤50),如下图,在棋盘上有一个中国象棋马. 规定: 1)马只能走日字 2)马只能向右跳 问给定起点x1,y1和终点x2,y2,求出马从x1,y1出发到x2,y2的合法路径条数. 输入描述 Input Description 第一行2个整数n和m 第二行4个整数x1,y1,x2,y2 输出描述 Output Descrip

codevs——2853 方格游戏(棋盘DP)

时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 题目描述 Description 菜菜看到了一个游戏,叫做方格游戏~ 游戏规则是这样的: 在一个n*n的格子中,在每个1*1的格子里都能获得一定数量的积分奖励,记左上角为(1,1),右下角为(n,n).游戏者需要选择一条(1,1)到(n,n)的路径,并获得路径上奖励的积分.对于路径当然也有要求啦,要求是只能往坐标变大的方向走[从(x,y)到(x+1,y)或者(x,y+1)],走过2n-1个区域到达(n,

【日常学习】【棋盘DP】【多线程DP】codevs1169 传纸条题解

转载请注明出处 [ametake版权所有]http://blog.csdn.net/ametake欢迎来看 这是经典的老题了 来源是08年NOIP提高组 上题目 题目描述 Description 小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题.一次素质拓展活动中,班上同学安排做成一个m行n列的矩阵,而小渊和小轩被安排在矩阵对角线的两端,因此,他们就无法直接交谈了.幸运的是,他们可以通过传纸条来进行交流.纸条要经由许多同学传到对方手里,小渊坐在矩阵的左上角,坐标(1,1),小轩坐在矩阵

codevs 2853 方格游戏--棋盘dp

方格游戏:http://codevs.cn/problem/2853/ 这和传纸条和noip方格取数这两个题有一定的相似性,当第一眼看到的时候我们就会想到设计$dp[i][j][k][l]$(i,j表示一个人走到 i 行 j 个点,而另一个人走到 k 行第l个点)这么一个状态. 转移方程当然是$dp[i][j][k][l] = max{ dp[i-1][j][k-1][l] ,dp[i-1][j][k][l-1] ,dp[i][j-1][k-1][l] ,dp[i][j-1][k][l-1 }$

【棋盘DP】【OpenJudge7614】最低通行费

最低通行费 总时间限制: 1000ms 内存限制: 65536kB [描述] 一个商人穿过一个 N*N 的正方形的网格,去参加一个非常重要的商务活动.他要从网格的左上角进,右下角出.每穿越中间1个小方格,都要花费1个单位时间.商人必须在(2N-1)个单位时间穿越出去.而在经过中间的每个小方格时,都需要缴纳一定的费用. 这个商人期望在规定时间内用最少费用穿越出去.请问至少需要多少费用? 注意:不能对角穿越各个小方格(即,只能向上下左右四个方向移动且不能离开网格). 输入第一行是一个整数,表示正方形

【基础练习】【棋盘DP】codevs2193 数字三角形ww题解

转载请注明出处 CSDN ametake版权所有 题目描述 Description 数字三角形必须经过某一个点,使之走的路程和最大 输入描述 Input Description 第1行n,表示n行 第2到n+1行为每个的权值 程序必须经过n div 2,n div 2这个点 输出描述 Output Description 最大值 样例输入 Sample Input 2 1 1 1 样例输出 Sample Output 2 数据范围及提示 Data Size & Hint n <=25 今天听