区间dp 51nod1021
Posted 6262369sss
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了区间dp 51nod1021相关的知识,希望对你有一定的参考价值。
题目链接:https://www.51nod.com/Challenge/ProblemSubmitDetail.html#!#judgeId=673021
代码:
参考博客:https://blog.csdn.net/qq_40772692/article/details/80183248
#include<iostream> #include<cstring> #include<algorithm> #include<queue> #include<map> #include<stack> #include<cmath> #include<vector> #include<set> #include<cstdio> #include<string> #include<deque> using namespace std; typedef long long LL; #define eps 1e-8 #define INF 0x3f3f3f3f #define maxn 105 /*struct point{ int u,w; }; bool operator <(const point &s1,const point &s2) { if(s1.w!=s2.w) return s1.w>s2.w; else return s1.u>s2.u; }*/ int n,m,k,t; int dp[maxn][maxn],value[maxn]; int main() { while(scanf("%d",&n)!=EOF){ for(int i=1;i<=maxn-1;i++){ for(int j=1;j<=maxn-1;j++){ dp[i][j]=INF;//初始化 } } memset(value,0,sizeof(value)); for(int i=1;i<=n;i++){ scanf("%d",&dp[i][i]);//这里偷懒了,用dp[i][i]这是存了一下输入的值 value[i]=value[i-1]+dp[i][i];//前缀和 dp[i][i]=0;//自己合并自己代价为0 } dp[0][0]=0; for(int len=1;len<=n;len++){//枚举长度 for(int i=1;i+len-1<=n;i++){//枚举起点 int ends=i+len-1;//终点 for(int j=i;j<=ends;j++){//枚举切割点 dp[i][ends]=min(dp[i][ends],dp[i][j]+dp[j+1][ends]+value[ends]-value[i-1]); } } } printf("%d ",dp[1][n]); } return 0; }
以上是关于区间dp 51nod1021的主要内容,如果未能解决你的问题,请参考以下文章