题目连接: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; }