Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 7118 | Accepted: 4385 |
Description
Input
Output
Sample Input
6 10 1 50 50 20 5
Sample Output
3650
题意就是给了几个数,依次拿走中间的数,每一次拿走第i个数都会有相应的代价value[i-1]*value[i]*value[i+1],问要求的是给定的序列 拿走所有中间的数 代价最少是多少。
就是矩阵相乘式DP。。。把那个数单提出来想象成要把它第一个拿走就OK了啊,怎么自己的脑筋总是奔到死胡同里面呢,气死我了。
代码:
#include <iostream> #include <algorithm> #include <cmath> #include <vector> #include <string> #include <cstring> #pragma warning(disable:4996) using namespace std; #define INF 0x3f3f3f3f int dp[105][105]; int value[105]; int num; int main() { int i,j,k,len; scanf("%d",&num); for(i=1;i<=num;i++) { scanf("%d",&value[i]); dp[i][i]=0; } for(i=1;i<=num;i++) { dp[i][i+1] = 0; dp[i][i+2] = value[i]*value[i+1]*value[i+2]; } for(len=3;len<=num;len++) { for(i=1,j=len+i;j<=num;i++) { j=len+i; dp[i][j]=INF; for(k=i+1;k<j;k++) { dp[i][j]=min(dp[i][j],dp[i][k]+dp[k][j]+value[k]*value[i]*value[j]);//想象成是第一个拿走的 } } } cout<<dp[1][num]<<endl; return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
POJ 1651:Multiplication Puzzle 矩阵相乘式DP
原文地址:http://blog.csdn.net/u010885899/article/details/47395459