DP + 접두사 와 - 황소 와 암소 - Acwing 1307
존 은 소 N 마 리 를 데 리 고 집회 의 전시 활동 에 참가 하려 고 하 는데, 이 소 들 은 황소 일 수도 있 고 암소 일 수도 있다.
소 들 은 일렬 로 서 야 하지만, 수 소 는 싸움 을 좋아 하 는 것 이다. 황소 가 사 고 를 일 으 키 지 않도록 존 은 임의의 두 마리 의 암소 사이 에 적어도 K 마리 의 암소 가 있어 야 한다 고 결정 했다.
모두 몇 가지 줄 을 서 는 방법 이 있 는 지 계산 해 보 세 요. 모든 수 소 는 같은 것 으로 볼 수 있 고 모든 암소 도 마찬가지 입 니 다. 답 은 5000011 에 대해 서 입 니 다.
입력 형식
한 줄 에 정수 N 과 K 두 개 를 입력 하 십시오.
출력 형식
하나의 정 수 는 줄 을 서 는 방법 수 를 나타 낸다.
데이터 범위
1 ≤ N ≤ 1 0 5 , 0 ≤ K < N 1≤N≤10^5, 0≤K1≤N≤105,0≤K
4 2
출력 예시:
6
예 를 들 어 해석 하 다.
6 가지 방법 은 암컷, 암컷, 암컷, 암컷, 암컷, 암컷, 암컷, 암컷 이다.
분석:
우 리 는 수 소 를 1, 암소 를 0 으로 볼 수 있다. 우 리 는 수 소 를 1, 암소 를 0 으로 볼 수 있다. 우 리 는 수 소 를 1, 암소 를 0 으로 볼 수 있다.
문 제 는 구조 길이 가 n 인 01 꼬치 로 전환 되 어 임의의 두 개의 1 간 의 거리 가 k 보다 크 고 조건 을 만족 시 키 는 01 꼬치 의 방안 총 수 를 구한다.문 제 는 구조 길이 가 n 인 01 꼬치 로 전환 되 어 임의의 두 개의 1 간 의 거리 가 k 보다 크 고 조건 을 만족 시 키 는 01 꼬치 의 방안 총 수 를 구한다.문 제 는 구조 길이 가 n 인 01 꼬치 로 전환 되 어 임의의 두 개의 1 간 의 거리 가 k 보다 크 고 조건 을 만족 시 키 는 01 꼬치 의 방안 총 수 를 구한다.
상태 표시:
f [i]: 마지막 1 을 i 위 에 놓 고 조건 을 만족 시 키 는 방안 의 총수.f [i]: 마지막 1 위 는 i 위 에 놓 고 조건 을 만족 시 키 는 방안 의 총수 입 니 다.f [i]: 마지막 1 위 는 i 위 에 놓 고 조건 을 만족 시 키 는 방안 의 총수 입 니 다.
i 위 는 1 을 놓 으 면 1 부터 i - k - 1 까지 임 의 할 수 있 기 때문에 f [i] = > j = 0 i - k + 1 f [j], 그 중에서 i - k - 1 > = 0.i 위 는 1 을 놓 으 면 1 부터 i - k - 1 까지 마음대로 할 수 있 으 므 로 f [i] = \ sum{j = 0} ^ {i - k + 1} f [j], 그 중 i - k - 1 > = 0.i 위 는 1 을 놓 으 면 1 부터 i - k - 1 까지 임 의 할 수 있 기 때문에 f [i] = > j = 0 i - k + 1 f [j], 그 중에서 i - k - 1 > = 0.
i - k - 1 < 0 이면 f [i] = 1 은 1 개 만 포함 한 다 는 뜻 이다.i - k - 1 < 0, f [i] = 1 은 1 개 만 포함 한 다 는 뜻 이다.i - k - 1 < 0, f [i] = 1 은 1 개 만 포함 한 다 는 뜻 이다.
경계 초기 화: f [0] = 1, f [1] 를 정확하게 계산 할 수 있 습 니 다. i - k - 1 < 0 시, 우 리 는 f [0] 를 누적 하면 됩 니 다.초기 화 경계: f [0] = 1, f [1] 를 정확하게 계산 할 수 있 습 니 다. i - k - 1 < 0 시, 우 리 는 f [0] 를 누적 하면 됩 니 다.초기 화 경계: f [0] = 1, f [1] 를 정확하게 계산 할 수 있 습 니 다. i - k - 1 < 0 시 에 우 리 는 f [0] 를 누적 하면 됩 니 다.
접두사 와 접 두 사 를 자주 구 해 야 하기 때문에 우 리 는 푸 시 하면 서 접두사 와 배열 s [i] = > j = 1 i f [j] 를 계산 할 수 있다.접두사 와 접 두 사 를 자주 구 해 야 하기 때문에 접두사 와 배열 s [i] = \ sum{j=1}^if[j]。 접두사 와 접 두 사 를 자주 구 해 야 하기 때문에 우 리 는 푸 시 하면 서 접두사 와 배열 s [i] = > j = 1i f [j] 를 계산 할 수 있다.
마지막 출력 s [n].마지막 출력 s [n].마지막 출력 s [n].
코드:
#include
#include
using namespace std;
const int N=1e5+10, mod=5000011;
int n,k;
int f[N],s[N];
int main()
{
cin>>n>>k;
f[0]=s[0]=1;
for(int i=1;i<=n;i++)
{
f[i]=s[max(i-k-1,0)];
s[i]=(s[i-1]+f[i])%mod;
}
cout<<s[n]<<endl;
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에 따라 라이센스가 부여됩니다.