首页 > 其他分享 >POJ - 1651 Multiplication Puzzle(区间dp)

POJ - 1651 Multiplication Puzzle(区间dp)

时间:2023-04-07 11:09:32浏览次数:41  
标签:int Puzzle len ++ num POJ Multiplication 该数 dp


题目大意:给你N个数,每次可以选择一个数进行剔除(第一个和最后一个不能选择),选出该数后,sum += 该数左边的数 * 该数 * 该数右边的数
问最小的sum是多少

解题思路:用dp[i][j]表示[i,j]区间被剔除得只剩下i,j的最小sum
dp[i][j] = dp[i][k] + dp[k][j] + num[i] * num[k] * num[j]

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 110;

int dp[N][N], num[N];
int n;
void solve() {
    memset(dp, 0, sizeof(dp));

    for (int i = 0; i < n - 2; i++)
        dp[i][i + 2] = num[i] * num[i + 1] * num[i + 2];

    for (int len = 3; len < n; len++) {
        for (int i = 0; i + len < n; i++) {
            int j = i + len;
            for (int k = i + 1; k < j; k++)
                if (dp[i][j] == 0) 
                    dp[i][j] = dp[i][k] + dp[k][j] + num[k] * num[i] * num[j];
                else 
                    dp[i][j] = min(dp[i][j], dp[i][k] + dp[k][j] + num[k] * num[i] * num[j]);
        }
    }
    printf("%d\n", dp[0][n - 1]);
}

int main() {
    while (scanf("%d", &n) != EOF) {
        for (int i = 0; i < n; i++)
            scanf("%d", &num[i]);
        solve();
    }
    return 0;
}


标签:int,Puzzle,len,++,num,POJ,Multiplication,该数,dp
From: https://blog.51cto.com/u_10970600/6175559

相关文章

  • POJ - 2955 Brackets(区间dp)
    题目大意:给出一个括号字符串,问这个字符串中符合规则的最长子串的长度解题思路:区间dp,用dp[i][j]表示[i,j]这个区间内有符合规则的最长子串的长度如果str[i]和str[j]能构成()或者[],那么dp[i][j]=dp[i+1][j-1]+2剩下的情况就是dp[i][j]=max(dp[i][j],dp[i][k]+dp[k......
  • POJ - 3666 Making the Grade(DP)
    题目大意:给你一个数组A,要求将这个数组变成数组B,使得Sum(abs(A[i]-B[i]))达到最小,且B是单调的解题思路:因为答案要求输出单调非递增或者单调非递减的的任意一个,那就只考虑单调非递增吧,因为两个的思路是相同的如果要变化的话,且变化的值要达到最小的话,那么只能变成和前一个相同或者......
  • POJ - 3186 Treats for the Cows(DP)
    题目大意:给你一个数组,每次你可以取两个数中的一个进行操作,要么取数组的第一个,要么数组的最后一个(取完之后,该数删除)假设取出来的数组组成了A现在要求使Sum=A[1]*1+A[2]*2+A[3]*3…+A[n]*n达到最大解题思路:用dp[i][j]表示前面取了i个,后面取了j个最大值则转......
  • POJ - 1661 Help Jimmy(DP)
    题目大意:中文题解题思路:因为是垂直下降,所以就可以将问题转变成从降落的平台到地面的最小时间因为只能从平台的左边或者右边才可以离开平台,所以可以分别计算出从左边和从右边到达地面的最短时间,并记录#include<cstdio>#include<cstring>#include<algorithm>usingnamespace......
  • POJ - 3616 Milking Time(DAG)
    题目大意:给出N头牛的产奶时间段和产奶量,每接完一头牛的奶后,需要休息R分钟问如何选择牛,才能使接到的产奶量达到最大解题思路:DAG,按产奶的结束时间大小排序#include<cstdio>#include<cstring>#include<algorithm>usingnamespacestd;constintN=1010;structInterval{......
  • 【POJ1679】The Unique MST(非严格次小生成树)
    problem给出一个连通无向图,判断它的最小生成树是否唯一如果唯一,输出生成树的大小,否则输出”NotUnique!”solution直接求非严格次小生成树如果次小生成树等于最小生成树则说明最小生成树不唯一,否则最小生成树一定是唯一的vector会TLE。。。codes#include<iostream>#include<algori......
  • POJ 2773 Happy 2006 二分+容斥原理(二进制枚举或dfs)
    Happy2006TimeLimit: 3000MS MemoryLimit: 65536KTotalSubmissions: 14003 Accepted: 4946DescriptionTwopositiveintegersaresaidtoberelativelyprimetoeachotheriftheGreatCommonDivisor(GCD)is1.Forinstance,1,3,5,7,9...areallrelativel......
  • The Suspects POJ - 1611 (并查集)
    题意:n个学生分属m个团体,一个学生可以属于多个团体。一个学生疑似患病则它所属的整个团体都疑似患病。已知0号学生疑似患病,以及每个团体都由哪些学生构成,求一共多少个学生疑似患病。分析:维护一个并查集,查询与0在同一集合的元素数量。#include<iostream>#include<cstdio>using......
  • POJ--3187 Backward Digit Sums(暴搜/减枝)
    记录5:302023-3-25http://poj.org/problem?id=3178reference:《挑战程序设计竞赛(第2版)》第二章练习题索引p135DescriptionFJandhiscowsenjoyplayingamenta......
  • POJ-2559-Largest Rectangle in a Histogram-DP或者单调栈
    ProblemE LargestRectangleinaHistogram TimeLimit:2000/1000MS(Java/Others)    MemoryLimit:65536/32768K(Java/Others)TotalSubmission(s):2498......