51nod1021 돌멩이 병합(구간dp)
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
int n;
int a[105],sum[105];
int dp[105][105];
const int INF=0x3f3f3f3f;
void init()
{
memset(dp,0,sizeof(dp));
memset(sum,0,sizeof(sum));
memset(a,0,sizeof(a));
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
init();
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
sum[i]=sum[i-1]+a[i];
}
for(int len=2;len<=n;len++)
// len 2 , len-1, len , i , -1, len
{
for(int i=1;i+len-1<=n;i++)//i
{
dp[i][i+len-1]=INF;// min, INF
for(int k=i;k<=i+len-1;k++)//k
{
dp[i][i+len-1]=min(dp[i][i+len-1],dp[i][k]+dp[k+1][i+len-1]+sum[i+len-1]-sum[i-1]);
}
}
}
printf("%d
",dp[1][n]);
}
return 0;
}
다음은 최적화되지 않은 방법입니다. 이것은 상대적으로 이해하기 쉽지만 이 수조는 배로 늘려야 합니다. 왜냐하면 여기는 n을 초과한 부분을 처리하지 않아서 공간을 낭비했지만 데이터가 작을 때는 문제가 없습니다.
#include <iostream>
#include <string.h>
#include <stdio.h>
using namespace std;
int a[1005],sum[1005];
int dp[1005][1005];
int n;
const int INF=0x3f3f3f3f;
void init()
{
memset(sum,0,sizeof(sum));
memset(a,0,sizeof(a));
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
init();
for(int i=1; i<=n; i++)
{
scanf("%d",&a[i]);
sum[i]=a[i]+sum[i-1];
//cout<<sum[i]<<endl;
}
for(int len=2; len<=n; len++)
{
for(int i=1; i<=n; i++)
{
int j=len+i-1;
dp[i][j]=INF;
for(int k=i; k<=j; k++)
{
dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j]+sum[j]-sum[i-1]);
}
}
}
printf("%d
",dp[1][n]);
}
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
POJ2955: Brackets(구간 DP)제목: 괄호 서열을 하나 드릴게요. 괄호는 두 가지(,)와 [,](), [], (), (), (), [], ()] [()] 이 괄호가 모두 일치하는 (,),(,(,)), ([(] 이런 것은 완전히 일치하지 않는 거예...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.