poj 1651 dp 记忆化搜索

本文解析了POJ1651题目,该题要求从给定的整数序列中取出中间n-2个数,并使得取出每个数的代价(即其两边相邻数与该数的乘积之和)最小。通过动态规划结合记忆化搜索的方法给出了求解思路及代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

poj 1651 dp 记忆化搜索
题意:
给出n个整数a1,a2,…,an,要求从中取出中间的n-2个数(两端的数不能取),取出每个数的代价为它两边的数和它的乘积,问取出这n-2个数的最小代价为多少?

限制:
3 <= n <= 100; 1 <= ai <= 100

思路:
dp 记忆化搜索
对于每个过程其实就是,枚举最后取的数a[i],然后把区间[l,r]分割成[l,i]和[i,r]两部分。
dp[l][r]=min(gao(l,i)+a[left]*a[i]*a[right]+gao(i,r))

/*poj 1651
  题意:
  给出n个整数a1,a2,...,an,要求从中取出中间的n-2个数(两端的数不能取),取出每个数的代价为它两边的数和它的乘积,问取出这n-2个数的最小代价为多少?
  限制:
  3 <= n <= 100; 1 <= ai <= 100
  思路:
  dp 记忆化搜索
  对于每个过程其实就是,枚举最后取的数a[i],然后把区间[l,r]分割成[l,i]和[i,r]两部分。
  dp[l][r]=min(gao(l,i)+a[left]*a[i]*a[right]+gao(i,r))
 */
#include
  
  
   
   
#include
   
   
    
    
#include
    
    
     
     
using namespace std;
#define LL __int64
const int N=105;
const int INF=0x3f3f3f3f;
int a[N];
LL dp[N][N];
int gao(int l,int r){
	if(dp[l][r]!=-1) return dp[l][r];
	int ret=INF;
	if(l+1==r) return dp[l][r]=0;
	for(int i=l+1;i
     
     
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值