BZOJ 1801 AHOI 2009 chess 중국 장기 DP
사고방식: 비교적 번거로운 DP.f[i][j][k]는 앞의 i행으로 표시하고 한 바둑알의 열을 j로 하고 두 바둑알의 열을 k로 하는 방안수를 놓은 다음에 여섯 개의 이동이 있다.
f[i][j][k] = f[i - 1][j][k] //
+ f[i - 1][j - 1][k] * (n - (j - 1) - k) + f[i - 1][j + 1][k - 1] * (j + 1) //
+ f[i - 1][j - 2][k] * (n - (j - 2) - k) * (n - (j - 2) - k - 1) // 0
+ f[i - 1][j][k - 1] * (n - j - (k - 1)) * j // 0 1
+ f[i - 1][j + 2][k - 2] * (j + 2) * (j + 1) // 1
f수조는 롱롱롱을 켜야 하며, 그렇지 않으면 폭발을 곱해야 한다.
전에 cf에서 나왔던 것 같아요.
CODE:
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define MAX 110
#define MO 9999973
using namespace std;
int m,n;
long long f[MAX][MAX][MAX];
int main()
{
cin >> m >> n;
f[0][0][0] = 1;
for(int i = 1; i <= m; ++i)
for(int j = 0; j <= n; ++j)
for(int k = 0; j + k <= n; ++k) {
f[i][j][k] = f[i - 1][j][k];
if(j - 1 >= 0)
f[i][j][k] += f[i - 1][j - 1][k] * (n - j - k + 1),f[i][j][k] %= MO;
if(k - 1 >= 0) {
f[i][j][k] += f[i - 1][j + 1][k - 1] * (j + 1),f[i][j][k] %= MO;
f[i][j][k] += f[i - 1][j][k - 1] * (n - j - k + 1) * j,f[i][j][k] %= MO;
}
if(j - 2 >= 0)
f[i][j][k] += f[i - 1][j - 2][k] * (n - j - k + 2) * (n - j - k + 1) >> 1,f[i][j][k] %= MO;
if(k - 2 >= 0)
f[i][j][k] += f[i - 1][j + 2][k - 2] * (j + 2) * (j + 1) >> 1,f[i][j][k] %= MO;
}
int ans = 0;
for(int j = 0; j <= n; ++j)
for(int k = 0; j + k <= n; ++k)
ans = (ans + f[m][j][k]) % MO;
cout << ans << endl;
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
CF 제목 모음 PART 1 #138 div 1 AA. Bracket Sequence standard input standard output A bracket sequence is a string, containing only characters "(", ")", ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.