【DP】 슬롯 점프

6251 단어 DP

D e s c r i p t i o n Description Description


모두들 일과 휴식을 함께 하자고 한다. A y u m i, M i t s u h i k o, G e n t a Ayumi, Mitsuhiko, Genta Ayumi, Mitsuhiko, Genta가 네모를 그리고 운동하러 나간다!그들은 공터에 와서 N개의 연속된 네모를 그렸고 각 네모마다 무작위로 숫자를 채웠다. 모두들 첫 번째 칸부터 시작하여 매번 현재 칸의 수를 초과하지 않고 뒤로 뛸 수 있다. 모두들 이 경기를 시작하여 누가 마지막 칸까지 뛰는 걸음수가 가장 적은지 보았다.리더인 G e n t a Genta Genta는 분명히 승리를 노렸기 때문에 Co n a n Conan Conan에 전화를 걸어 도움을 요청했지만 Co n a n Conan Conan이 게임을 하고 있어서 도움을 요청했다.

I n p u t Input Input


첫 번째 행에 그림의 칸 수를 나타내는 정수 N N N 을 입력합니다.두 번째 행에는 각 칸의 수 a i ai ai를 나타내는 N 정수가 포함됩니다.

O u t p u t Output Output


한 줄을 출력합니다. 점프의 최소 걸음 수를 표시합니다.

S a m p l e I n p u t Sample Input SampleInput

5
2 3 1 1 1

S a m p l e O u t p u t Sample Output SampleOutput

2	

E x p l a i n Explain Explain


40%의 데이터가 N<=10, ai<=10을 충족합니다.100% 데이터에는 N<=5000, ai<=1000이 충족됩니다.

T r a i n Train Train O f Of Of T h o u g h t Thought Thought


f[j] f[j] f[j]를 설정하여 jj 이 칸에 필요한 최소 걸음수 동적 이동 방정식은 f[j] = m in(f[i] + 1, f[j]) f[j] =min(f[i] +1, f[j]) f[j] =min(f[j] =min(f[i] +1, f[j])

C o d e Code Code

#include
#include
#include
#include
using namespace std;
int f[5005],a[5005],n;
int main()
{
	memset(f,0x7f,sizeof(f));
	scanf("%d",&n);
	for (int i=1; i<=n; ++i)
	 scanf("%d",&a[i]);
	f[1]=0;
	for (int i=1; i<=n; ++i)//      
	 for (int j=i+1; j<=i+a[i]; ++j)//        
	  f[j]=min(f[i]+1,f[j]);
	printf("%d",f[n]);
}

좋은 웹페이지 즐겨찾기