NOJ 536 开心的mdd

传说中很简单的DP,不会做!BT~

cxiaojia给我讲了讲才明白啊!应该说是很标准的DP,完全符合DP的定义:

分别求出子最优解,根据子最优解一步步扩大求出所需的最优解!

时间复杂度小于O(n^3),总比枚举O((n-1)!)好!

View Code
#include <stdio.h>

#include <memory.h>



#define MAXVAL 0xfffffff





struct Data

{

    int r,c,min;

}map[102][102];



int main()

{

    int i,j,k,maxj,maxk,tmp,n;

    freopen("in.txt","r",stdin);

//    freopen("out2.txt","w",stdout);



    while(scanf("%d",&n)!=EOF)

    {

//        for(i=1;i<=n;i++)

//            for(j=i+1;j<=n;j++)

//                map[i][j].min=MAXVAL;

        for(i=1;i<=n;i++)

            scanf("%d %d",&map[i][i].r,&map[i][i].c),map[i][i].min=0;





        for(i=2;i<=n;i++)

        {

            maxj=n-i+1;

            for(j=1;j<=maxj;j++)

            {

                maxk=j+i-1;    map[j][maxk].min=MAXVAL;

//                for(k=1;k<maxk;k++)//很郁闷,为什么去掉上边的初始化MAXVAL就错,加上却对

                    //因为它本来没必要! 为什么非要加上啊! 调试才发现这里的k从1开始!,应该从

                    //j开始

                for(k=j;k<maxk;k++)

                {

                    tmp=map[j][k].r*map[j][k].c*map[k+1][maxk].c+map[j][k].min+map[k+1][maxk].min;

                    if(tmp<map[j][maxk].min)

                    {

                        map[j][maxk].min=tmp;

                        map[j][maxk].r=map[j][k].r;

                        map[j][maxk].c=map[k+1][maxk].c;

                    }

                }

            }

        }



        printf("%d\n",map[1][n].min);

    }



    return 0;

}

 

 

你可能感兴趣的:(OJ)