POJ1651 Multiplication Puzzle ACM解题报告(区间dp)

来源:互联网 发布:plc编码器编程 编辑:程序博客网 时间:2024/06/14 08:44

这题就是个简单的区间DP,方法是很简单,重点是这种思想,不确定最优解是i-j中的哪一个,就要遍历一下然后取最优解

状态转移方程d(i,j)=min(d(i,k)+dp(k,j)+a[i]*a[k]*a[j]) 注意a[k]是最后取走的一个数字。

类似区间dp的还有矩阵链乘。我再去找个练练。

#include<iostream>#include<cstdio>#include<cctype>#include<cstdlib>#include<cmath>#include<algorithm>#include<cstring>#include<string>#include<vector>#include<queue>#include<map>#include<set>#include<sstream>#include<stack>using namespace std;#define MAX 105typedef long long LL;const double pi=3.141592653589793;const int INF=1e9;const double inf=1e20;int n,a[101],d[101][101];int dp(int i,int j){    if(d[i][j]>=0) return d[i][j];    if(i+1==j) return 0;    int ans=INF;    for(int k=i+1;k<j;k++) ans=min(ans,dp(i,k)+dp(k,j)+a[i]*a[k]*a[j]);    return d[i][j]=ans;}int main(){    cin>>n;    memset(d,-1,sizeof(d));    for(int i=1;i<=n;i++) scanf("%d",&a[i]);    printf("%d\n",dp(1,n));    return 0;}

0 0
原创粉丝点击