文章目录

  • 题目描述
  • 解析
  • 代码
  • thanks for reading!

题目描述

解析

'这题挺好的
思路:dp[i][j]表示必须把i和j配对,可达到的最大值
首先:

dp[i][j]=dp[i-1][j-1]+a[i]*b[j];

然后可以分别尝试把男生或女生往前放弃一段:

for(int k=i-1;k>=1;k--){//男不要k到i-1 dp[i][j]=max(dp[i][j],dp[k-1][j-1]+a[i]*b[j]-(suma[i-1]-suma[k-1])*(suma[i-1]-suma[k-1]));}for(int k=j-1;k>=1;k--){//女不要k到j-1 dp[i][j]=max(dp[i][j],dp[i-1][k-1]+a[i]*b[j]-(sumb[j-1]-sumb[k-1])*(sumb[j-1]-sumb[k-1]));}

这道题我看了题解
我本来也有类似的想法,但当时我觉得男生女生可能都放弃了一段,所以应该同时枚举男生和女生放弃的位置,这样时间复杂度就变成了n^4,无法接受
但是我忽略了一个性质;ab都不小于0,所以两边都放弃肯定不如让放弃的那两段再配对一些好,所以每次一定只会放弃一边
这样就变成了题解的n^3思路

另外本题还有一些有意思的细节:

1.再后面再加上一对水平为0的男女,最后统计dp[n+1][n+1],这样就可以包含那些没有取到第n对的正解
2.i不等于0时,dp[0][i]和dp[i][0]都是没有意义的,所以应该赋值为无穷小
3.虽然答案在int范围内,但前缀和之差平方的操作会爆int,所以应该开longlong

代码

#include<bits/stdc++.h>
#define ll long long
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;
const int N=600;
const int M=2e6+100;
int m,n;
ll dp[N][N];
ll a[N],b[N],suma[N],sumb[N];
int main(){scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%d",&a[i]);suma[i]=suma[i-1]+a[i];
//      printf("i=%d sum=%d\n",i,suma[i]);}for(int i=1;i<=n;i++){scanf("%d",&b[i]);sumb[i]=sumb[i-1]+b[i];}a[++n]=0;b[n]=0;suma[n]=suma[n-1];sumb[n]=sumb[n-1];//再加一对for(int i=0;i<=n;i++){for(int j=0;j<=n;j++) dp[i][j]=-2e9;}dp[0][0]=0;for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){dp[i][j]=dp[i-1][j-1]+a[i]*b[j];for(int k=i-1;k>=1;k--){//不要k到i-1
//              printf("aa\n");dp[i][j]=max(dp[i][j],dp[k-1][j-1]+a[i]*b[j]-(suma[i-1]-suma[k-1])*(suma[i-1]-suma[k-1]));}for(int k=j-1;k>=1;k--){//不要k到j-1
//              printf("bb\n");dp[i][j]=max(dp[i][j],dp[i-1][k-1]+a[i]*b[j]-(sumb[j-1]-sumb[k-1])*(sumb[j-1]-sumb[k-1]));}
//          printf("i=%d j=%d dp=%d\n",i,j,dp[i][j]);}} printf("%lld",dp[n][n]);return 0;
}

thanks for reading!

不止代码:生日欢唱(ybtoj-区间dp)相关推荐

  1. 【AtCoder - 4244 】AtCoder Express 2 (区间dp 或 暴力枚举,思维)

    题干: In Takahashi Kingdom, there is a east-west railroad and N cities along it, numbered 1, 2, 3, ... ...

  2. 不止代码:ybtoj-消除木块(区间DP)

    题目描述 n个木块排成一列,每个木块都有一个颜色. 每次,你都可以点击一个木块,这样被点击的木块以及和它相邻并且同色的木块就会消除. 如果一次性消除了k个木块,那么就会得到k*k分. 给定你一个游戏初 ...

  3. 不止代码:乘法游戏 题解(区间dp)

    题目描述 乘法游戏是在一行牌上进行的.每一张牌包括了一个正整数.在每一个移动中,玩家拿出一张牌,得分是用它的数字乘以它左边和右边的数,所以不允许拿第1张和最后1张牌.最后一次移动后,这里只剩下两张牌. ...

  4. 【区间dp】uva10003+ uva 1626 括号匹配问题 【有空自己记忆化写一下!!!】

    讲道理,其实我还不是太懂,这个题看到了两种写法 之前大概想的差不多,要这样实现呀: 常规写法,大概n--3 递归写法,稍微好理解一点 好了,接下来自从看了liuchuo的博客我要变身玛丽苏橙色了 题目 ...

  5. POJ 2955 Brackets (区间DP)

    题目链接:http://poj.org/problem?id=2955 Brackets Time Limit: 1000MS   Memory Limit: 65536K Total Submiss ...

  6. HDU 5115 Dire Wolf ——(区间DP)

    比赛的时候以为很难,其实就是一个区间DP= =..思路见:点我. 区间DP一定要记住先枚举区间长度啊= =~!因为区间dp都是由短的区间更新长的区间的,所以先把短的区间更新完.. 代码如下: 1 #i ...

  7. 编程之美2015资格赛 题目2 : 回文字符序列 [ 区间dp ]

    传送门 题目2 : 回文字符序列 时间限制:2000ms 单点时限:1000ms 内存限制:256MB 描述 给定字符串,求它的回文子序列个数.回文子序列反转字符顺序后仍然与原序列相同.例如字符串ab ...

  8. 动态规划——区间dp

    在利用动态规划解决的一些实际问题当中,一类是基于区间上进行的,总的来说,这种区间dp是属于线性dp的一种.但是我们为了更好的分类,这里仍将其单独拿出进行分析讨论. 让我们结合一个题目开始对区间dp的探 ...

  9. HDU 5115 Dire Wolf 区间dp

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5115 Dire Wolf Time Limit: 5000/5000 MS (Java/Others ...

  10. HDU 5693 D Game 区间dp

    D Game 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5693 Description 众所周知,度度熊喜欢的字符只有两个:B 和D. 今天,它 ...

最新文章

  1. Redis数据结构之字符串
  2. 课后作业-阅读任务-阅读提问-4
  3. TensorFlow机器学习实战指南之第二章
  4. 死锁的产生原因和解决办法
  5. word中表格加粗某一行
  6. Daily Scrum 10.23
  7. robot---百度百科
  8. 区块链“搅局”中介风云
  9. 【爆肝帝,花费3个月整理】金九银十面试季,2020-2021字节跳动所有,软件测试面试题拿走不谢!(附详细答案解析)
  10. 戴尔服务器加无线网卡用不了网,电脑安装了无线网卡却不能用是怎么回事?
  11. 雅虎邮箱 转发设置_如何在Yahoo Mail中设置外出答复
  12. Linux 进程查看命令 ps top htop dstat
  13. vue打印数据,可分页打印
  14. 建文高考成绩查询2021,深圳市建文外国语学校2020年高考喜报
  15. 文件上传黑名单和白名单校验
  16. 拿到软考高级证书就是高级职称了吗?
  17. 【毕业设计】天气数据分析系统 - python 大数据
  18. 更改服务器网站默认端口,更改服务器默认端口号
  19. 记录一篇Spring 5的WebClient 的 重试问题
  20. 《自然语言处理:基于预训练模型的方法》读书笔记:第2章 自然语言处理基础

热门文章

  1. mysql数据连接查询_mysql数据库 连接查询
  2. mindray心电监护仪使用说明_怎么看监护仪上的参数
  3. java jdbc分页_使用JDBC进行分页查询
  4. 机器学习之格式变化——reshape(-1,1)
  5. 算法题目——爬楼梯(动态规划)
  6. [数据结构]树、森林与二叉树之间的相互转换方法
  7. Factory Method(工厂方法)--对象创建型模式
  8. 数据结构与索引-- mySql索引诡异事件
  9. 数据结构与算法--简单栈实现及其应用
  10. 算法----最大承载量下的最大价值问题