poj 1651 Multiplication Puzzle(구간 DP)

1324 단어 동적 기획구간DP
제목 링크: poj 1651
토론판에서 모두 사용하는 행렬 곱셈을 보면 풀 수 있지만 구간 dp도 풀 수 있다
물문제, dp[i][j]는 i에서 j 구간에 필요한 가장 작은 점수를 없애고 매번 최소치를 옮겨다니며 마지막으로 dp[2][n-1]이 답이다.
(출력할 때 자신이 멍청해졌어요. 샘플을 보고 dp[2][5]를 출력했어요. 타당하게wa는 45발...)
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define LL long long
#define mod 1000000007
#define inf 0x3f3f3f3f

using namespace std;

int main()
{
    int a[110];
    LL dp[110][110];
    int n;
    while(~scanf("%d",&n))
    {
        memset(a,0,sizeof(a));
        memset(dp,0,sizeof(dp));
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&a[i]);
        }
        for(int l=0;l<=n-1;l++)
        {
            for(int i=1;i+l<=n;i++)
            {
                int j=i+l;
                dp[i][j]=inf;
                for(int k=i;k<=j;k++)
                {
                    dp[i][j]=min(dp[i][j],dp[i][k-1]+dp[k+1][j]+a[k]*a[i-1]*a[j+1]);
                }
               // printf("dp%d%d=%d
",i,j,dp[i][j]); } } printf("%lld
",dp[2][n-1]); } return 0; }

좋은 웹페이지 즐겨찾기