nyoj737 돌멩이 합병【구간dp】
논문 문제 마지막에 수조를 구하고 [1,n][2,n+1]을 찾아야 하는데......[n, n+n+1]의 최고치, 이 문제는 첫 번째 문제만 출력하면 됩니다.
이 문제는 특별히 나를 괴롭히는 점이 하나 있다. 구간마다 두 단락으로 나뉘는데, 뒷부분의 값이 아직 두루 퍼지지 않았는데, 어떡하지?그래서 1층 순환은 구간의 길이이고 2층 순환은 구간의 시작이며 3층 순환은 구간의 중점이다.보아하니 dp의 관건도 상태 이동 방정식을 쓰는 것만은 아닌 것 같다.
/******************
nyoj737
2016.2.18
732 868 C/C++ 02-18 15:47:11
******************/
#include <iostream>
#include <cstdio>
#include<cstring>
using namespace std;
int f[403][403],n,num[403],t[403];
void init()
{
t[0]=0;
for(int i=1;i<=2*n-1;i++)t[i]=t[i-1]+num[i];
}
void cal()
{
memset(f,0x3f3f3f3f,sizeof(f));
for(int i=1;i<=2*n-1;i++) f[i][i]=0;
for(int k=1;k<n;k++)//length
for(int i=1;i<=n;i++)//start
for(int j=i;j<i+k;j++)//mid
{
f[i][i+k]=min(f[i][i+k],f[i][j]+f[j+1][i+k]+t[i+k]-t[i-1]);
}
//for(int i=1;i<=n;i++)for(int j=i+1;j<=i+n-1;j++) printf("i=%d,j=%d,f=%4d\t\t",i,j,f[i][j]);
}
int main()
{
//freopen("cin.txt","r",stdin);
while(~scanf("%d",&n))
{
for(int i=1;i<=n;i++) scanf("%d",&num[i]);
for(int i=n+1;i<=2*n;i++) num[i]=num[i-n];
// for(int i=1;i<=2*n-1;i++) printf("i=%d,num=%d
",i,num[i]);
init();
cal();
int maxn=0x3f3f3f3f;
// for(int i=1;i<=n;i++) printf("i=%d,j=%d,f=%d
",i,i+n-1,f[i][i+n-1]);
printf("%d
",f[1][n]);
}
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Git 병합 브랜치의 프로세스 단계 이해정상적인 dev-master 프로세스 병합: (다른 지점과 유사하게 통합) 1. 통합할 dev 지점은 모든 파일을 업데이트하여 제출합니다 주의: 제출할 현지화 수정 서류가 필요하지 않으면 제출하지 않는 것이 좋습니다...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.