워커 연습 게임 1 트리 dp + dfs 시퀀스
문제 풀이:
처음에는 트리 DP가 밑에서 위로 업데이트되는 것을 생각했는데 아들이 많을 때 상황이 너무 많아서 고려할 수가 없었어요.
dfs 순서에 따라 나무의 점을 하나하나 염색할 수 있습니다.이렇게 한 노드 x를 염색할 때, 그의 아버지 노드는 이미 염색되었다.정의 상태 dp[i][j]dp[i][j]dp[i][j]는 dfs 서열의 전 ii 노드를 jj j 색상으로 염색하는 몇 가지 방안이 있습니까?ii i 결점 염색의 경우 다음 두 가지 옵션이 있습니다.
4
4
코드: /**
* Author : Xiuchen
* Date : 2020-04-09-19.11.59
* Description : dfs +
*/
#pragma GCC optimize(1)
#pragma GCC optimize(2)
#pragma GCC optimize(3,"Ofast","inline")
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
typedef long long ll;
const int inf = 0x3f3f3f3f;
const ll INF = 0x3f3f3f3f3f3f3f3fLL;
const ll mod = 1e9 + 7;
const int maxn = 310;
int gcd(int a, int b){
return b ? gcd(b, a % b) : a;
}
int n, k;
ll dp[maxn][maxn];
vector<int> G[maxn];
int main(){
scanf("%d%d", &n, &k);
int x, y;
for(int i = 1; i <= n - 1; i++){
scanf("%d%d", &x, &y);
G[x].push_back(y);
G[y].push_back(x);
}
dp[0][0] = 1;
for(int i = 1; i <= n; i++){
for(int j = 1; j <= k; j++)
dp[i][j] = (dp[i - 1][j] + dp[i - 1][j - 1] * (k - j + 1) % mod) % mod;
}
ll ans = 0;
for(int i = 1; i <= k; i++) ans = (ans + dp[n][i]) % mod;
printf("%lld
", ans);
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
제11회 산동성 대학생 프로그램 설계 경연대회 Adventurer's Guild(dp)
전송문
제목:
몬스터의 수량 n, 캐릭터의 생명력 H, 캐릭터의 공격 S 건네기;다음 n행, 매 행위 매 몬스터의 혈액량 h, 공격 s, 가치 w;
매번 몬스터를 처치할 때마다 h의 혈액량과 s의 공격을 소모한다.
...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.
/**
* Author : Xiuchen
* Date : 2020-04-09-19.11.59
* Description : dfs +
*/
#pragma GCC optimize(1)
#pragma GCC optimize(2)
#pragma GCC optimize(3,"Ofast","inline")
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
typedef long long ll;
const int inf = 0x3f3f3f3f;
const ll INF = 0x3f3f3f3f3f3f3f3fLL;
const ll mod = 1e9 + 7;
const int maxn = 310;
int gcd(int a, int b){
return b ? gcd(b, a % b) : a;
}
int n, k;
ll dp[maxn][maxn];
vector<int> G[maxn];
int main(){
scanf("%d%d", &n, &k);
int x, y;
for(int i = 1; i <= n - 1; i++){
scanf("%d%d", &x, &y);
G[x].push_back(y);
G[y].push_back(x);
}
dp[0][0] = 1;
for(int i = 1; i <= n; i++){
for(int j = 1; j <= k; j++)
dp[i][j] = (dp[i - 1][j] + dp[i - 1][j - 1] * (k - j + 1) % mod) % mod;
}
ll ans = 0;
for(int i = 1; i <= k; i++) ans = (ans + dp[n][i]) % mod;
printf("%lld
", ans);
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
제11회 산동성 대학생 프로그램 설계 경연대회 Adventurer's Guild(dp)전송문 제목: 몬스터의 수량 n, 캐릭터의 생명력 H, 캐릭터의 공격 S 건네기;다음 n행, 매 행위 매 몬스터의 혈액량 h, 공격 s, 가치 w; 매번 몬스터를 처치할 때마다 h의 혈액량과 s의 공격을 소모한다. ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.