Atcoder 400 Number Of Amidakuji 사유, DP

1223 단어 DP
제목: m기둥은 평행으로 배치하고 간격은 1이며 기둥마다 높이는 n+1이다. 
두 기둥 사이의 어느 각도[1,2...n]에 한 줄을 연결할 수 있다(비스듬히 할 수 없고 연결된 선마다 공통된 단점이 없다)
시작점(1,1)은 매번 아래로 내려가고, 직선을 만나면 이 직선의 방향으로 올라간다.
1<=n<=100. 1<=m<=8. 기점에서 (n+1,k)까지 갈 수 있는 몇 가지 연속 방안이 있는지 물어보세요.
 
모든 직선에는 공통된 단점이 없기 때문에 왼쪽이나 오른쪽을 연속할 수 없다는 것을 의미한다.
비헤이비어 계층으로 DP.매번 결정을 내릴 때마다 아래로 내려간다.(이렇게 결정하면 세 가지가 된다. 좌우, 그리고 움직이지 않는다.)
dp[i][j]를 설정하여 몇 가지 선 그리기 방안을 설정하여 (0,0)에서 출발하여 (i,j)에 도달하도록 한다.
dp[i+1][k] = Σ dp[i][j] *num[j][k]  .[num[j][k]는 줄마다 몇 가지 선을 긋는 방안이 있는지 j열에서 k열까지 2^m회 폭력 예처리를 하면 된다.
#include 
using namespace std;
typedef long long ll;
typedef pair ii;
const int N=2e2+5,mod=1e9+7;
ll n,m,k,dp[N][N],num[N][N];
int main(){
	ios::sync_with_stdio(false);cin.tie(0);
	cin>>n>>m>>k;
	for(int s=0;s>j)&1;
			int b2=(s>>(j+1))&1;
			if(b1==b2&&b1)	ok=false;
		}
		if(!ok)	continue;
		for(int j=0;j>j)&1){
				num[j][j+1]++,num[j+1][j]++;
				j+=2;
			}
			else{
				num[j][j]++;
				j++;
			}
		}		
	}
	dp[0][0]=1;
	for(int i=0;i

 
 
 

좋은 웹페이지 즐겨찾기