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