luogu2051中國象棋

2022-09-08 00:09:21 字數 1200 閱讀 4865

題目描述

這次小可可想解決的難題和中國象棋有關,在乙個n行m列的棋盤上,讓你放若干個炮(可以是0個),使得沒有乙個炮可以攻擊到另乙個炮,請問有多少種放置方法。大家肯定很清楚,在中國象棋中炮的行走方式是:乙個炮攻擊到另乙個炮,當且僅當它們在同一行或同一列中,且它們之間恰好 有乙個棋子。你也來和小可可一起鍛鍊一下思維吧!

輸入輸出格式

輸入格式:

一行包含兩個整數n,m,之間由乙個空格隔開。

輸出格式:

總共的方案數,由於該值可能很大,只需給出方案數模9999973的結果。

輸入輸出樣例

輸入樣例#1:

1 3輸出樣例#1: 7說明

樣例說明

除了3個格仔裡都塞滿了炮以外,其它方案都是可行的,所以一共有2*2*2-1=7種方案。

資料範圍

100%的資料中n和m均不超過100

50%的資料中n和m至少有乙個數不超過8

30%的資料中n和m均不超過6

分析:

說是一道狀壓dp,然而根本不用預處理狀態

先分析一下題目:要保證每一行每一列的炮要<=2個(原因很簡單,超過兩個就肯定會有一對可以進行攻擊)

f[i][j][k] 表示已經放了前i行,其中有j列是只放了1個炮,有k列放了2個炮的方案數,那麼0的個數就是m-j-k個

轉移一共有6種狀態 (乘法和加法原理):

中間盡量別%,開long long

注意:因為在最後統計的時候寫錯了一點(把i寫成j),十連wa 慘痛的教訓!!!!!

這裡寫**片

#include

#include

#include

#define ll long long

using

namespace

std;

const

int mod=9999973;

int n,m;

ll f[101][101][101];

void doit()}}

ll tot=0;

for (i=0;i<=m;i++)

printf("%d",tot%mod);

}int main()

P2051 AHOI2009 中國象棋

這次小可可想解決的難題和中國象棋有關,在乙個 n 行 m 列的棋盤上,讓你放若干個炮 可以是 0個 使得沒有乙個炮可以攻擊到另乙個炮,且它們之間恰好 有乙個棋子。你也來和小可可一起鍛鍊一下思維吧!一行包含兩個整數 n,m之間由乙個空格隔開。總共的方案數,由於該值可能很大,只需給出方案數模 99999...

洛谷 P2051 中國象棋

orz stdcall 首先要想出來,每行最多只能放兩個棋子,這是顯然的 於是決策就是一行一行地處理 30分的做法就是裸的列舉,暴搜,列舉這一行放 放幾個 然後想到了壓位dp,按3進製表示當前棋盤的狀態,即某一列沒有棋子,或者有乙個,兩個棋子,能過50分 接著可以發現,棋子的順序是無所謂的,並不需要...

洛谷P2051 中國象棋

這次小可可想解決的難題和中國象棋有關,在乙個n行m列的棋盤上,讓你放若干個炮 可以是0個 使得沒有乙個炮可以攻擊到另乙個炮,請問有多少種放置方法。大家肯定很清楚,在中國象棋中炮的行走方式是 乙個炮攻擊到另乙個炮,當且僅當它們在同一行或同一列中,且它們之間恰好 有乙個棋子。你也來和小可可一起鍛鍊一下思...