POJ 1651 Multiplication Puzzle
2016-03-21 17:32
162 查看
好久不写blog了,也是因为各种各样的事情没有功夫写代码,新学期开始了继续努力~!
算分课上讲了动态规划,这次拿这个题目练手,这次用数组m[i][j]存储区间i到j的最小做运算的数量,状态转移也比较简单,代码也单独拿出来作为一个函数这样看起来比较清楚。
比较烦人的地方在于角标和实际数值之间的关系,倒腾了半天
算分课上讲了动态规划,这次拿这个题目练手,这次用数组m[i][j]存储区间i到j的最小做运算的数量,状态转移也比较简单,代码也单独拿出来作为一个函数这样看起来比较清楚。
比较烦人的地方在于角标和实际数值之间的关系,倒腾了半天
#include <iostream> #include <cstdio> #include <limits.h> using namespace std; #define maxn 105 int m[maxn][maxn]={0}; int n; int size[maxn]={0}; void calcu(int a,int b){ //printf("(%d,%d)\n",a,b); int tmin = INT_MAX; for(int cut = a;cut <b;++cut){ int temp = m[a][cut] + m[cut+1][b] + size[a-1]*size[cut]*size[b]; if(temp < tmin) tmin = temp; } m[a][b] = tmin; } int main(){ scanf("%d",&n); for(int i=0;i<n;++i) scanf("%d",&size[i]); for(int i=1;i<n-1;++i){ for(int j=1;j<n-i;++j){ calcu(j,j+i); } } printf("%d\n",m[1][n-1]); //system("pause"); return 0; }