• 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;
    }
  • 相关阅读:
    Python内置模块02
    Python常用模块
    hdu 5943(素数间隔+二分图匹配)
    poj 3372(找规律)
    poj 2369(置换群)
    poj 3270(置换群+贪心)
    bzoj 4034(DFS序+线段树)
    poj 2337(单向欧拉路的判断以及输出)
    poj 1041(字典序输出欧拉回路)
    csu 1798(树上最远点对,线段树+lca)
  • 原文地址:https://www.cnblogs.com/fornever/p/2466244.html
Copyright © 2020-2023  润新知