题意:给定n个数,每次取其中一个数(第一个数和最后一个数不能取),得分+=这个数乘以它左边的数和右边的数。要求最后的得分最小。
思路:因为开始知道这个题的DP方程和矩阵连乘的DP方程一样,所以一直根据方程想思路,结果想了很久都没想出来,最后看了评论区的大神提示,瞬间想通。看来自己实力还是很渣渣啊。。唉
我们假设只有a1,a2,a3三个数,那我们只能取a2,那最后的得分=a1*a2*a3; 假如有n个数,设k为最后一个取出来的数,那么,最后一次的得分只与a1,an,ak有关,那么我们把整个区间以k分成两段,左边一段的最后一次得分必然为a1*ak*ai(i>1 &&i<k),也就是说左边的得分与右边怎么取无关,
那么我们总得分dp[1][n]=dp[1][k]+dp[k][n]+a[1]*a[k]*a[n];
于是我们可以得出递归方程dp[i][j]=dp[i][k]+dp[k][i]+a[i]*a[k]*a[j]. 这个方程和矩阵连乘问题的方程基本一样。那么我们可以写下如下代码
#include "iostream" using namespace std; #define len 110 int main() { int n; int a[len]; int dp[len][len];//dp[1][n]是最后结果 ,dp[i][j]=dp[i][k]+dp[k+1][j]+p*q int i,j,k; scanf("%d",&n); for (i=1;i<=n;i++) { scanf("%d",&a[i]); } //递归公式 dp[i][j]=min{dp[i][k]+dp[k+1][j]+k*i*j,k>=i k<j} for (i=1;i<=n;i++) { memset(dp[i],0,sizeof(dp[i])); dp[i][i+2]=a[i]*a[i+1]*a[i+2]; } for (int m=1;m<=n;m++) { for (i=1;i<=n;i++) { j=i+3+m; for (j=i+3;j<=n;j++) { int min=9999999;//注意这个数要取大点 for (k=i+1;k<j;k++) { if(min>dp[i][k]+dp[k][j]+a[k]*a[i]*a[j]) { min=dp[i][k]+dp[k][j]+a[k]*a[i]*a[j]; } } dp[i][j]=min; } } } printf("%d\n",dp[1][n]); return 0; }
相关推荐
在"POJ2002-Squares"这个问题中,参赛者可能需要编写一个程序来处理与正方形相关的数学问题。这可能涉及到计算和处理大量正方形,例如找出一个范围内的所有完全平方数,或者计算不同大小正方形覆盖区域的重叠部分。...
标签“POJ3253 POJ3253-Fence Repair STL 优先队列”进一步强调了这个编程问题与POJ3253编号相关,问题核心在于修复栅栏,而解决方法采用了C++的STL库中的优先队列。 压缩包子文件的文件名列表包含以下几个文件: 1...
【标题】"POJ1426-Find The Multiple【BFS+同余模】"是一道来源于北京大学在线编程平台POJ的算法题目,主要涉及到了广度优先搜索(BFS)与同余模运算的知识点。这道题目要求解决的是寻找一个整数的倍数问题,可能...
【标签】"POJ 3020 Antenna Placement"是该问题的唯一标识,便于在POJ系统中搜索和分类。标签通常包含比赛的平台、问题编号以及问题的主题,有助于参赛者快速定位和回顾相关题目。 【文件名称列表】: 1. "POJ3020-...
POJ 1000 - 2000 是一个涵盖广泛的题目区间,包含了大量的初级到中级难度的问题,适合程序员们逐步进阶。这些题目按照官方的分类,可以系统地帮助学习者理解和解决各种类型的问题,从而提高编程和算法设计的能力。 ...
【描述】"解题报告+AC代码"意味着这个压缩包包含了对POJ1837问题的解决方案的详细分析以及通过了所有测试用例的正确代码。解题报告通常会涵盖问题理解、算法思路、时间复杂度分析以及可能的优化策略。AC代码代表...
【标题】"POJ1258-Agri-Net【Prim】" 是一个编程竞赛题目,来源于北京大学的在线评测系统POJ(Problem Online ...通过深入研究提供的资源,我们可以增进对这些问题解决策略的理解,并提高自己在类似问题上的解决能力。
【标签】"POJ 1010 STAMPS"是问题的标识符,POJ系统中的每个题目都有一个唯一的编号,1010是这个问题在系统中的ID,"STAMPS"可能是题目涉及的主题或关键词,可能与邮票、收集或组合优化有关。 【压缩包子文件的文件...
1. **问题描述**:POJ3414题目可能描述了一个关于“Pots”的情境,比如可能涉及到水资源分配、种植管理等实际或抽象的问题,要求参赛者设计程序来处理这些问题。 2. **输入输出格式**:解题报告会详细说明程序需要...
【标签】"POJ 2503 Babelfish"是该问题的标识符,其中"POJ"是平台名称,"2503"是题目在系统中的唯一编号,"Babelfish"是题目本身的英文名称,可能来源于现实世界中的某个概念或故事,用于增加问题的趣味性。...
通过这种方式,可以学习到如何解决类似问题的方法,提高自己的编程和算法能力。同时,也可以通过这个例子了解到在面对实际编程挑战时,如何进行问题分析、选择合适的算法和数据结构,以及如何优化代码以满足时间和...
【标签】"POJ 3122 Pie"是该问题的标识,其中"POJ"是平台名称,"3122"是问题的唯一编号,"Pie"是问题的具体主题。这样的标签方便用户搜索和归类,同时也能反映出问题的基本类型或特点。 【文件】包含两个文件: 1. ...
今天我们要探讨的是一个名为"POJ2525-Text Formalization"的问题,它涉及到一种高效的数据结构——Trie树(也称为前缀树或字典树)。这个题目来源于北京大学的在线判题系统POJ,旨在考察程序员对字符串处理和Trie树...
这是魔兽世界终极版POJ的-测试数据,找了好久才找到的。 本来想设置为0积分,但是它居然自动收费(o_ _)ノ。 看传送门:https://pan.baidu.com/s/1cCIwW8psGDASu2JdZawG3Q
【描述】"北大POJ1201-Intervals 解题报告+AC代码" 暗示了解决此问题的策略已经记录在解题报告中,并且通过了POJ的自动测试系统(AC即Accepted),意味着提供的代码是正确且高效的。通常,这样的解题报告会包含对...
【标签】"POJ 3295 Tautology"是这个问题的标识,其中"POJ"代表了题目来源,"3295"是题目在系统中的编号,"Tautology"则是题目的英文原名,可能与逻辑中的“自明命题”或者“恒真式”有关,因为这类问题常常涉及到...
【标题】"POJ2299-Ultra-QuickSort"是北京大学在线判题系统POJ上的一道编程题目,其主要涉及的算法是快速排序(Ultra-QuickSort)。快速排序是一种高效的排序算法,由C.A.R. Hoare在1960年提出。它的基本思想是采用...
【描述】"北大POJ3258-River Hopscotch 解题报告+AC代码"指的是参赛者或编程爱好者在解决该问题后,编写的一份解题报告,其中包含了他们解决问题的思路和过程,以及最终通过测试的源代码。AC(Accepted)是编程竞赛...
在POJ这样的在线编程平台上,这类问题通常要求高效且准确的算法,因为它们需要处理各种大小的输入并在有限的时间内给出结果。 【压缩包子文件的文件名称列表】:"POJ1009-Edge Detection.cpp"、"POJ1009-Edge ...
【标题】"POJ1004 - Financial Management" 是一个来自北京大学在线判题系统POJ(Problem Set of Peking University)的编程题目。这个题目主要涉及到计算机科学中的算法设计和实现,特别是与财务管理和计算相关的...