P2051 AHOI2009 中國象棋 (dp)

2021-10-24 15:44:34 字數 885 閱讀 8376

傳送門

n和m太大了,狀壓dp不行。換一種方式:

定義f[i][j][k]為前i行中有就 j 列放了乙個,k列放了2個的方案數。

總共有m列,什麼也沒放的有 s=m-j-k 列。

第 i 行有三種選擇不放,放乙個(放s或j中,k已經放不下了),放兩個(全放s,乙個s乙個j,兩個j),需要注意一直保持 s+j+k=m。

#include

using

namespace std;

typedef

long

long ll;

const

int n=

110;

const

int mod=

9999973

;int n,m,f[n]

[n][n]

;int c[n]

;int

main()

^$ 組合數c(i,2)

cin>>n>>m;

f[0][

0][0

]=1;

for(

int i=

1;i<=n;i++

)for

(int j=

0;j<=m;j++

)for

(int k=

0;k+j<=m;k++

)int ans=0;

for(

int j=

0;j<=m;j++

)for

(int k=

0;k+j<=m;k++

) ans=

(ans+f[n]

[j][k]

)%mod;

cout

}

P2051 AHOI2009 中國象棋

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

題解 P2051 AHOI2009 中國象棋

題目鏈結 題目大意 求在 n 行 m 列的棋盤上放置若干個炮使得它們互不攻擊的方案數,對 9999973 取模 動態規劃,計數 分析 沒有炮互相攻擊等價於沒有三個炮在同一行 列 考慮用 f i m 1 m 2 表示前 i 行,有 m 1 列有乙個炮,m 2 列有兩個炮的方案數 可以用刷表法降低思維難...

P2051 AHOI2009 中國象棋 DP

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