动态规划 Multiplication Puzzle poj 1651

来源:互联网 发布:集思宝如何导出数据 编辑:程序博客网 时间:2024/06/05 18:36

题目连接:http://poj.org/problem?id=1651

题目大意:给你一个数字序列abcde……,从中不断的取出数字,不能取头和尾的数据,每次取出一个数时,代价为这个数*它前面的那个数*它后面的那个数,然后次数不放回,知道剩下两个数为止,求最小代价。

代码:

#include <iostream>#include <cstring>#include <limits>using namespace std;const int INTMAX = numeric_limits<int>::max();int dp[101][101]={0};//dp[i][j]为i到j之间的数全部取尽(不包括i和j)的得分的最小值int i,j,d,k;int N,data[101],temp;int main(){    cin>>N;    for(i=1;i<=N;i++){        cin>>data[i];    }    for(d=2;d<=N-1;d++){        for(i=1;i+d<=N;i++){            j=i+d;            dp[i][j]=INTMAX;            for(k=i+1;k<j;k++){//k为i和j之间的划分及ij之间的所有数中最后去k                temp=dp[i][k]+dp[k][j]+data[i]*data[k]*data[j];                if(temp<dp[i][j]){                    dp[i][j]=temp;                }            }        }    }    cout<<dp[1][N]<<endl;    return 0;}


原创粉丝点击