洛谷 P2051 AHOI2009 中國象棋

2021-09-02 23:07:42 字數 2607 閱讀 9422

題目:中國象棋

思路:首先是30分暴力——

直接dfs就好。

用row和col儲存狀態。

#include

using

namespace std;

#define maxn 100

#define read(x) scanf("%d",&x)

#define md 9999973

int n,m;

int rw[maxn+5]

,col[maxn+5]

;int

dfs(

int x,

int y)

ans=

(ans+

dfs(x,y+1)

)%md;

return ans;

}int

main()

50分暴力——

狀壓,把每個位置上的棋子數三進製狀壓一下,作為dp的第二維狀態,然後我們的dfs就可以記憶化了。

100分演算法——

f[i][j][k]表示前i行,放了1個棋子的有j列,放了2個棋子的有k列的方案數。

轉移——

在原來沒有棋子的列上放乙個棋子:

f[i]

[j][k]

=f[i]

[j][k]

+f[i-1]

[j-1

][k]

*(m-j-k+1)

在原來有乙個棋子的列上放乙個棋子:

f[i]

[j][k]

=f[i]

[j][k]

+f[i-1]

[j+1

][k-1]

*(j+1)

在原來兩條沒有棋子的列上各放乙個棋子:

f[i]

[j][k]

=f[i]

[j][k]

+f[i-1]

[j-2

][k]

*(m-k-j+2)

*(m-k-j+1)

/2在原來一條沒有棋子的列上和一條有棋子的列上各放乙個棋子:

f[i]

[j][k]

=f[i]

[j][k]

+f[i-1]

[j][k-1]

*(m-k-j+1)

*j在原來兩條有乙個棋子的列上各放乙個棋子:

f[i]

[j][k]

=f[i]

[j][k]

+f[i-1]

[j+2

][k-2]

*(j+2)

*(j+1)

/2

初始化——

f[0][0][0]=1

f[i][j][k]=f[i-1][j][k]

以及不能忘記每一行只能有兩個棋子——

if(i==1&&k>0) continue;

if(j+k2>im) continue;

#include

using

namespace std;

#define maxn 100

#define read(x) scanf("%d",&x)

#define md 9999973

#define ll long long

int n,m;

ll f[maxn+5]

[maxn+5]

[maxn+5]

;ll dp()

ll ans=0;

for(

int j=

0; j<=m; j++)}

return ans;

}int

main()

重點——

寫了個打表的**,本機可過,luogu可能卡掉了它,僅供參考,切勿抄襲——

#include

using

namespace std;

#define maxn 100

#define read(x) scanf("%d",&x)

#define md 9999973

#define ll long long

int n,m;

ll f[maxn+5]

[maxn+5]

[maxn+5]

;ll dp()

ll ans=0;

for(

int j=

0; j<=m; j++)}

return ans;

}int

main()

,");for

(n=1

; n<=

100; n++

)printf

("}");

if(n!=

100)

printf

(",");

else

printf

("};\n\n");

}printf

("int main()"

,'"'

,'"'

,'"'

,'"');

return0;

}

洛谷 P2051 AHOI2009 中國象棋

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

洛谷 P2051 AHOI2009 中國象棋

這道題主要是狀態很難想到 首先可以看出每行每列不能超過2個棋子 也就是說有0,1,2三種狀態 所以可以一行一行來處理 那就用放了0個棋子的列數是 那麼這個時候狀態轉移方程就非常好寫了。對於當前這一行可以不放,放乙個,放兩個棋子 表示沒有棋子的列,1表示有1個棋子的列。那麼有幾種情況 不放放乙個在 放...

洛谷 P2051 AHOI2009 中國象棋

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