题目链接:https://www.luogu.com.cn/problem/P1043

这道题与石子合并很类似,都是把一个环强制改成一个链,然后在链上做区间dp

要初始化出1~2n的前缀和,方便在O(1)的时间内查询[l,r]区间的和。

f[l][r][h] ->

第一维:左端点;第二维:右端点;第三维:分成了几段。

动态转移方程:

很显然的一个初始化:f[l][r][1]=del(sum[r]-sum[l-1]);

转移:f[l][r][h]=min/max(f[l][r][h],f[l][k][h-1]*del(sum[r]-sum[k]));

注意k的枚举

注意初始化数的大小,尤其是memset,0x3f,0x7f,0xc0等。

AC代码:

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<cstring>
  4.  
  5. using namespace std;
  6.  
  7. int n,m;
  8. int a[],sum[];
  9. int f1[][][],f2[][][];
  10. int maxn,minn=0x7f;
  11.  
  12. inline int del(int x){
  13. return (x%+)%;
  14. }
  15.  
  16. int main(){
  17. memset(f1,0x3f,sizeof(f1));
  18. scanf("%d%d",&n,&m);
  19. for(int i=;i<=n;i++){
  20. scanf("%d",&a[i]);
  21. a[i+n]=a[i];
  22. sum[i]=sum[i-]+a[i];
  23. }
  24. for(int i=;i<=n;i++) sum[i+n]=sum[i]+sum[n];
  25. for(int l=;l<=*n;l++){
  26. for(int r=l;r<=*n;r++){
  27. f1[l][r][]=f2[l][r][]=del(sum[r]-sum[l-]);
  28. }
  29. }
  30. for(int i=;i<=n;i++){
  31. for(int l=;l+i-<=*n;l++){
  32. int r=l+i-;
  33. for(int h=;h<=m;h++){
  34. for(int k=l+h-;k<r;k++){
  35. f1[l][r][h]=min(f1[l][r][h],f1[l][k][h-]*del(sum[r]-sum[k]));
  36. f2[l][r][h]=max(f2[l][r][h],f2[l][k][h-]*del(sum[r]-sum[k]));
  37. }
  38. }
  39. }
  40. }
  41. for(int i=;i<=n;i++){
  42. maxn=max(maxn,f2[i][i+n-][m]);
  43. minn=min(minn,f1[i][i+n-][m]);
  44. }
  45. printf("%d\n%d",minn,maxn);
  46. return ;
  47. }

AC代码

洛谷 P1043 数字游戏(区间dp)的更多相关文章

  1. 洛谷 P1043 数字游戏 区间DP

    题目描述 丁丁最近沉迷于一个数字游戏之中.这个游戏看似简单,但丁丁在研究了许多天之后却发觉原来在简单的规则下想要赢得这个游戏并不那么容易.游戏是这样的,在你面前有一圈整数(一共n个),你要按顺序将其分 ...

  2. 洛谷——P1043 数字游戏

    https://www.luogu.org/problem/show?pid=1043 题目描述 丁丁最近沉迷于一个数字游戏之中.这个游戏看似简单,但丁丁在研究了许多天之后却发觉原来在简单的规则下想要 ...

  3. 洛谷P1043 数字游戏

    题目描述 丁丁最近沉迷于一个数字游戏之中.这个游戏看似简单,但丁丁在研究了许多天之后却发觉原来在简单的规则下想要赢得这个游戏并不那么容易.游戏是这样的,在你面前有一圈整数(一共n个),你要按顺序将其分 ...

  4. 洛谷P1043数字游戏

    题目 区间DP,将\(maxn[i][j][k]\)表示为i到j区间内分为k个区间所得到的最大值,\(minn\)表示最小值. 然后可以得到状态转移方程: \[maxn[i][j][k]= max(m ...

  5. 洛谷 P1043 数字游戏

    题目传送门 解题思路: 跟石子合并差不多,区间DP(环形),用f[i][j][s]表示从i到j分成s段所能获得的最大答案,枚举断点k,则f[i][j][s] = min(f[i][j][s],f[i] ...

  6. $loj10156/$洛谷$2016$ 战略游戏 树形$DP$

    洛谷loj Desription Bob 喜欢玩电脑游戏,特别是战略游戏.但是他经常无法找到快速玩过游戏的方法.现在他有个问题. 现在他有座古城堡,古城堡的路形成一棵树.他要在这棵树的节点上放置最少数 ...

  7. 洛谷P1040 加分二叉树(区间dp)

    P1040 加分二叉树 题目描述 设一个n个节点的二叉树tree的中序遍历为(1,2,3,…,n),其中数字1,2,3,…,n为节点编号.每个节点都有一个分数(均为正整数),记第i个节点的分数为di, ...

  8. 洛谷 P1220 关路灯 区间DP

    题目描述 某一村庄在一条路线上安装了 n 盏路灯,每盏灯的功率有大有小(即同一段时间内消耗的电量有多有少).老张就住在这条路中间某一路灯旁,他有一项工作就是每天早上天亮时一盏一盏地关掉这些路灯. 为了 ...

  9. 洛谷P2470 [SCOI2007]压缩(区间dp)

    题意 题目链接 Sol 神仙题Orz 考虑区间dp,如果我们只设\(f[l][r]\)表示\(s_{lr}\)被压缩的最小长度,而不去关心内部\(M\)分布的话,可能在转移的时候转移出非法状态 因此考 ...

随机推荐

  1. 一次 utf-8 bom引起的问题

    同事代码新增加了功能,推到服务器上,意外导致登录失败,回退到之前的版本上,可以正常使用. 这次只上传了 route.php 文件,系统登录失败. 随后使用kdiff3对比了两版本的route.php文 ...

  2. [USACO16OPEN]248&262144

    Description 在1*n的序列中,每次可以合并两个相邻且相等的数,变成它们两个加1,求最大的数. Solution 设\(f[i][j]\)表示\([i,k)\)这个区间能合并出\(j\)的最 ...

  3. SpringMVC进行Ajax请求页面显示乱码

    最近在项目的使用过程中发现在springmvc的项目中,使用返回页面的请求方式,数据都能正常显示,但是对于ajax的请求,始终显示乱码. 首先第一种是因为我们在web.xml中配置了spring的字符 ...

  4. c#自带压缩类实现的多文件压缩和解压

    用c#自带的System.IO.Compression命名空间下的压缩类实现的多文件压缩和解压功能,缺点是多文件压缩包的解压只能调用自身的解压方法,和现有的压缩软件不兼容.下面的代码没有把多文件的目录 ...

  5. 基于pyqt5的图片素材批量处理工具

    功能 分辨率的批量转换,文件夹递归查找 像素偏移量批量调整,文件夹单层查找 画布的大小的批量进行调整,不进行缩放,文件夹单层查找 界面 通过PyUIC生成的代码 # -*- coding: utf-8 ...

  6. wap网站开发小记(转载)

    一:网页的一些标记 1:声明 <!DOCTYPE html PUBLIC "-//WAPFORUM//DTD XHTML Mobile 1.0//EN" "http ...

  7. NotePad++安装及配置

    NotePad++是一款轻量级的语言开发工具,是学习编程语言入门工具. 下面介绍下配置方法(Java为例) 配置插件NppExec 配置JAVA编译命令javac 配置JAVA运行命令java 上述两 ...

  8. 使用QtCreator运行Gstreamer程序

    1.创建一个简单的Plain C Application 2.Build System选择qmake 3.Kit Selection默认Desktop Qt x.xx.x GCC 64bit 4..p ...

  9. 959F - Mahmoud and Ehab and yet another xor task xor+dp(递推形)+离线

    959F - Mahmoud and Ehab and yet another xor task xor+dp+离线 题意 给出 n个值和q个询问,询问l,x,表示前l个数字子序列的异或和为x的子序列 ...

  10. VS“无法查找或打开PDB文件”是怎么回事?如何解决

    有时候,我们使用 VS(Visual Studio)编译程序时会出现“无法查找或打开PDB文件”的提示,并且此时程序会生成失败,无法运行,如下图所示: 大家不要惊慌,出现这种提示并不是代码写错了,而是 ...