码迷,mamicode.com
首页 > 其他好文 > 详细

poj 1651 区间dp

时间:2015-05-22 21:17:56      阅读:125      评论:0      收藏:0      [点我收藏+]

标签:dp

给你一个数列每次去一个数   第一个和最后一个不能取    没去一个数都加上这个数乘以前面的和后面的数  求最小和;

dp【i】【j】 表示i-j的最小和    那么专一方程为  k大于i&&k小于j   这这样枚举中间k的位置   dp【i】【j】=min(dp【i】【j】,dp[i][x]+dp[x][j]+num[x]*num[i]*num[j])


#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;

#define INF 0x3f3f3f3f
int n,num[110],dp[110][110];
int min(int a,int b)
{
	return a<b?a:b;
}
int main()
{
	int i,j;
	while(~scanf("%d",&n))
	{
		for(i=1;i<=n;i++)
		scanf("%d",&num[i]);
		memset(dp,0,sizeof(dp));
		for(i=1;i<=n-2;i++)
		dp[i][i+2]=num[i]*num[i+1]*num[i+2];
		for(int k=4;k<=n;k++)
		{
			for(i=1;i+k-1<=n;i++)
			{
				j=i+k-1;
				dp[i][j]=999999999;
				for(int x=i+1;x<=j-1;x++)
				{
					dp[i][j]=min(dp[i][j],dp[i][x]+dp[x][j]+num[x]*num[i]*num[j]);
				}
			}
		}
		printf("%d\n",dp[1][n]);
	}
	return 0;
}

poj 1651 区间dp

标签:dp

原文地址:http://blog.csdn.net/zxf654073270/article/details/45920443

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!