재미있는 제목.
나중에 나는 행렬을 그렸다. status[1][1]부터 분명히 첫 번째는 1-6, 여섯 가지 가능성이 있다. status[0][1]----status[0][6]는 모두 1이다. 그 다음에 두 번째 투구를 계산한다. 두 번째 투구할 때 그 경계를 고려해야 한다. 두 번째는 i이고 상계는 6*i이다. 각각 2,12이다. 그리고 이 범위에서 순서대로 데이터를 기입한다. 그리고 우리는 status[2][2]를 보면 이것은 한 가지 가능성만 있다. 첫 번째는 1이다.status[2][3], 분명히 두 가지만 가능(첫 번째 1, 두 번째 2, 또는 첫 번째 2, 두 번째 1), 이 숫자는 어떻게 계산합니까?우리는status[2][3]를 예로 들면 두 번째 투하, 화는 3이다. 여기는 앞의 두 번의 누적 합이 3이고 한 가지 뜻이 누설되었다. 첫 번째는 반드시 3, 1과 2보다 작아야 한다. 네가 선택하든지 네가 선택하든지 한 숫자만 선택하면 나는 대응하는 숫자를 너와 조합해서 3을 만들어야 한다. 이 말은 매우 중요하다. 이 말은 네가 j범위보다 작게 선택하든지 간에 반드시 하나의 숫자가 너와 3을 합쳐야 한다. 그래서전이방정식은 이전 줄의 j보다 작은 숫자를 모두 합친 것이다. 그러나 여기서 주의해야 한다. 여기는 상황을 나누어야 한다. status[2][8]를 보면 여기는 8을 나타낸다. 그러면 첫 번째는 1이면 두 번째는 아무리 던져도 8의 상황이 나타나지 않을 것이다. 그래서 여기는 이전 줄의 8-6, 즉 j=2의 부분부터 뒤로 누적되고 status[2]를 보면 1의 부분부터 누적되기 때문에 조건 판단을 해야 한다.현재 j가status[i-1][i+6]보다 작으면status[i-1][2*i]부터 뒤로 누적되기 때문에 여기서 판단을 해야 한다.
코드는 다음과 같다.
// 15 50
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXSIZE 100
long long dp[MAXSIZE][MAXSIZE];
void Cal(int len)
{
memset(dp,0,sizeof(dp));
int i,j,k;
for(i=1;i<=6;i++)
{
dp[1][i]=1;
}
for(i=2;i<=len;i++)
{
for(j=i;j<=6*i;j++)
{
if(j<=(i-1+6))
{
for(k=i-1;k<j;k++)
{
dp[i][j]+=dp[i-1][k];
}
}
else
{
for(k=j-6;k<j;k++)
{
dp[i][j]+=dp[i-1][k];
}
}
}
}
}
int main()
{
int i,j;
Cal(15);
printf("%d
",dp[15][50]);
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.