[bfs 트리 계층화] [DP] hihocoder Pro.1147 시공진
Manchery가 말한 bfs 트리의 제목이기 때문에 bfs 트리는 조상으로 돌아가는 가장자리가 존재하지 않기 때문에 bfs 트리의 점의 깊이는 뿌리 노드가 가장 짧은 길이에 이르는 것을 고려하면 한 층 한 층 DP가 있다.영fi, j, s는 DP가 i층까지 표시하고 모두 j개의 점을 사용했다. i층에 s개의 점이 있을 때의 방안수는 제목이 n개의 점 거리만 k로 요구하기 때문에 우리는 DP가 k층(영1노드는 0층)까지 가기만 하면 나머지 점은 끝없이 이어지면 된다.
f, j, s를 고려하면 f-3-1, j-3s, w에서 옮길 수 있다.
4
4
4
4
4
그래서 옮기는 건...
이렇게 하면 돼요.
#include
#include
#include
using namespace std;
const int N=110,P=1e9+7;
int n,k,f[N][N][N];
int fac[N],inv[N];
inline int Pow(int x,int y){
int ret=1;
for(;y;y>>=1,x=1LL*x*x%P) if(y&1) ret=1LL*ret*x%P;
return ret;
}
inline int C(int x,int y){
return 1LL*fac[x]*inv[y]%P*inv[x-y]%P;
}
inline void add(int &x,int y){
if((x+=y)>=P) x-=P;
}
int main(){
freopen("1.in","r",stdin);
freopen("1.out","w",stdout);
scanf("%d%d",&n,&k);
fac[0]=inv[0]=inv[1]=1;
for(int i=1;i<=n;i++) fac[i]=1LL*fac[i-1]*i%P;;
for(int i=2;i<=n;i++) inv[i]=1LL*(P-P/i)*inv[P%i]%P;
for(int i=1;i<=n;i++) inv[i]=1LL*inv[i]*inv[i-1]%P;
f[0][1][1]=1;
for(int i=1;i<=k;i++)
for(int j=1;j<=n;j++)
for(int s=1;s<=j;s++)
for(int w=1;w<=j-s;w++)
if(is],1LL*f[i-1][j-s][w]*C(n-j+s-1,s)%P*Pow(Pow(2,w)-1,s)%P*Pow(2,s*(s-1)/2)%P);
else
add(f[i][j][s],1LL*f[i-1][j-s][w]*C(n-j+s-1,s-1)%P*Pow(Pow(2,w)-1,s)%P*Pow(2,s*(s-1)/2)%P);
int ans=0;
for(int i=k+1;i<=n;i++)
for(int j=1;j<=n;j++)
add(ans,1LL*f[k][i][j]*Pow(2,(n-i)*(n-i-1)/2+j*(n-i))%P);
printf("%d
",ans);
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
[BOJ]11048(python)python 풀이 DP를 이용해 풀이 보통 이런 문제는 dfs나 bfs로 풀이하는 것이여서 고민을 했는데 이 문구 덕분에 DP 를 이용해 풀이할 수 있었다 뒤로 돌아가는 등의 경우를 고려하지 않아도 되기 때문이다 코...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.