【Codeforces Round #418 (Div. 2)】Codeforces 814E An unavoidable detour for home
12768 단어 동적 기획codeforces
#include
#include
#include
using namespace std;
#define LL long long
#define DP dp[c][j][k][x][y]
const int p=1000000007;
int d[55],n;
LL dp[2][51][51][51][51];
void upd(LL &x,LL y)
{
x+=y;
x%=p;
}
int main()
{
scanf("%d",&n);
for (int i=1;i<=n;i++) scanf("%d",&d[i]);
dp[0][d[1]==2][d[1]==3][d[2]==2][d[2]==3]=1;
for (int i=2,c=0;i0,sizeof(dp[c])),c^=1)
for (int j=0;j<=i;j++)
for (int k=0;j+k<=i;k++)
for (int x=0;j+k+x<=i;x++)
for (int y=0;j+k+x+y<=i;y++)
if (DP)
{
if (!j&&!k)
{
if (x||y) upd(dp[c][x][y][0][0],DP);
continue;
}
if (d[i+1]==2)
{
if (j)
{
upd(dp[c^1][j-1][k][x+1][y],DP*j);
if (x) upd(dp[c^1][j-1][k][x-1][y],DP*j*x);
if (y) upd(dp[c^1][j-1][k][x+1][y-1],DP*j*y);
}
if (k)
{
upd(dp[c^1][j+1][k-1][x+1][y],DP*k);
if (x) upd(dp[c^1][j+1][k-1][x-1][y],DP*k*x);
if (y) upd(dp[c^1][j+1][k-1][x+1][y-1],DP*k*y);
}
}
else
{
if (j)
{
upd(dp[c^1][j-1][k][x][y+1],DP*j);
if (x) upd(dp[c^1][j-1][k][x][y],DP*j*x);
if (y) upd(dp[c^1][j-1][k][x+2][y-1],DP*j*y);
if (x>=2) upd(dp[c^1][j-1][k][x-2][y],DP*j*x*(x-1)/2);
if (x&&y) upd(dp[c^1][j-1][k][x][y-1],DP*j*x*y);
if (y>=2) upd(dp[c^1][j-1][k][x+2][y-2],DP*j*y*(y-1)/2);
}
if (k)
{
upd(dp[c^1][j+1][k-1][x][y+1],DP*k);
if (x) upd(dp[c^1][j+1][k-1][x][y],DP*k*x);
if (y) upd(dp[c^1][j+1][k-1][x+2][y-1],DP*k*y);
if (x>=2) upd(dp[c^1][j+1][k-1][x-2][y],DP*k*x*(x-1)/2);
if (x&&y) upd(dp[c^1][j+1][k-1][x][y-1],DP*k*x*y);
if (y>=2) upd(dp[c^1][j+1][k-1][x+2][y-2],DP*k*y*(y-1)/2);
}
}
}
printf("%I64d
",dp[n&1][0][0][0][0]);
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
01 가방, 완전 가방, 다중 가방 dp(동적 기획 입문 dp)01 가방은 2진법으로 직접 표시할 수 있지만 데이터 양이 너무 많으면 시간을 초과하는 것이 폭력이다.01 가방의 사상은 바로 이 물품에 대해 내가 넣은 가치가 큰지 안 넣은 가치가 큰지 비교하여 방정식 f[i][v...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.