首页 > 其他分享 >P1063 能量项链 区间DP

P1063 能量项链 区间DP

时间:2022-11-12 19:57:15浏览次数:80  
标签:long len 枚举 DP 项链 区间 长度 P1063 dp

题干 AC

我原本的dfs的转移式子就只有将两边的单个拎出来,将其余的大基团合并

也就是这两个情况:

 和

但是忽视了类似这种的情况:

也就是说,我没有讨论两个大基团合并的情况,只讨论了单点跟基团合并

后来开始使用区间DP的套路

然而出现了如下这些问题:


先上个AC代码,其中有死亡处被我用括号括起来了

#include<iostream>
#include<cstdio>
#define NUM 510
#define int long long
#define FOR(a,b,c) for( int a = b;a <= c;a++ )
using namespace std;

int n;
int a[NUM];
long long dp[NUM][NUM];

signed main(){
    
    cin >> n;
    FOR( i,1,n ){
        cin >> a[i];
        a[i+n] = a[i];
    }
    
    FOR( len,2,n+2 ){ //枚举区间长度(n+1)
        FOR( l,1,n*2-len+1 ){ //( 循环条件改了,原来是枚举到n )
            int r = l+len-1;
            
//          if( len == 2 ){ //( 删除掉! )
//              dp[l][r] = a[l]*a[r]*a[r+1];
//              printf( "区间为%d-%d,dp = %d\n",l,r,dp[l][r] );
//              continue;
//         }
            FOR( t,l+1,r-1 ){
                dp[l][r] = max( dp[l][r],dp[l][t]+dp[t][r]+a[l]*a[t]*a[r] );//(*a[t]*a[r])
            }
//          printf( "区间为%d-%d,dp = %d\n",l,r,dp[l][r] );
        }
    }
    long long ans = 0;
    FOR( i,1,n ){
        ans = max( ans,dp[i][i+n] );//( [i+n] )
    }
    cout << ans;
    
    return 0;
}
AC代码

1. 不要特判长度为$2$,直接让长度$3$的去作为最小的区间,甚至可以不要长度为2的更新

2. 答案为dp[i][i+n],因为是个环,所以要有$n+1$个数

3. 如2,区间长度也要是$n+1$

4. 枚举起点要枚举到$n*2-len+1$,因为不同的区间长度,不能都是枚举到$n$是吧(xjj)

5. 理解问题了就是,转移方程应该是由转移得到

 

标签:long,len,枚举,DP,项链,区间,长度,P1063,dp
From: https://www.cnblogs.com/xiao-en/p/16884440.html

相关文章

  • 数位DP
    通常问法:区间[l,r]的数中,满足某一条件数的个数。技巧1:[x,y]中满足情况的个数位f[y]-f[x-1]技巧2:从树的角度考虑问题例题1:度的数量题意:寻找[L,R]之间满足,是K个互不相等......
  • 在WordPress中,如果你想自动转换URL,跳转至超链接页面,你可以利用内置的函数make_clickab
    <?php/*在WordPress中,如果你想自动转换URL,跳转至超链接页面,你可以利用内置的函数make_clickable()执行此操作。如果你想基于WordPress之外操作该程序,那么你可以参考wp-in......
  • 区间dp
    区间dp:顾名思义,就是从小的区间推向大的区间。区间dp的一般模板:for(intlen=1;len<=n;len++){for(intj=1;j+len<=n+1;j++){intr=j+len-1;......
  • P3226 [HNOI2012]集合选数(状压 DP)
    P3226[HNOI2012]集合选数要求选出集合\(S\)满足如果\(x\)选择了,\(2x\)和\(3x\)都不能选择。求\(\{1,2,\dots,n\}\)的符合要求的子集数量。\(n\le10^5\)。......
  • 基于QPSK+LDPC的微波信道误码率matlab仿真
    目录一、理论基础二、核心程序三、测试结果FPGA教程目录MATLAB教程目录一、理论基础  1.1QPSKQPSK数字解调包括:模数转换、抽取或插值、匹配滤波、时钟和载......
  • UDP --02--UDP广播数据
    设计模型局域网UDP广播数据端UdpBroadCast.cpp #include<tchar.h>//_T宏#include<stdio.h>//printfsprintf#include<iostream>//coutfstreamusingnamespacestd;......
  • 如何检测UDP 端口是否连接成功?
    (转,仅作为个人学习备用,原文地址: https://blog.51cto.com/kusorz/1749878)根据测试环境的不同,用户可以参阅如下方式测试UDP端口的连通性。假设待测试服务器的IP地址为1.1.......
  • Apple开发_Socket_UDP协议广播机制的实现
    1、前言1.1什么是UDP协议广播机制?举一个例,例如在一群人群中,一个人要找张三,于是你向人群里大喊一声(广播):“谁是张三”如果它是张三,它就会回应你,在网络中也是一样的......
  • ABC 267 D - Index × A(Not Continuous ver.) (DP)
    https://atcoder.jp/contests/abc267/tasks/abc267_d题目大意:给定长度为n的数组a,让我们从中选择m个数字,按顺序组成B(a1----am)之后,sum=1*a1+……+m*am;问我们sum最大......
  • 在关闭RDP远程连接后,保持windows程序的运行
    问题在最近将笔记本放在了宿舍24小时开机由于挂网课,在教室里可以用微软RDClientapp连接宿舍里的电脑查看刷课进度。但是在几次连接后发现,在ipad端关闭'RDP'远程连接后,笔......