_Never_

I walk slowly,but I will never stop.

导航

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;
}

 

 

posted on 2012-04-23 12:24  _Never_  阅读(328)  评论(0编辑  收藏  举报