| 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