您的位置:首页 > 其它

动态规划 Multiplication Puzzle poj 1651

2011-09-25 15:21 375 查看
题目连接: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]
<<endl;
    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: