不止代码:生日欢唱(ybtoj-区间dp)
文章目录
- 题目描述
- 解析
- 代码
- 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)相关推荐
- 【AtCoder - 4244 】AtCoder Express 2 (区间dp 或 暴力枚举,思维)
题干: In Takahashi Kingdom, there is a east-west railroad and N cities along it, numbered 1, 2, 3, ... ...
- 不止代码:ybtoj-消除木块(区间DP)
题目描述 n个木块排成一列,每个木块都有一个颜色. 每次,你都可以点击一个木块,这样被点击的木块以及和它相邻并且同色的木块就会消除. 如果一次性消除了k个木块,那么就会得到k*k分. 给定你一个游戏初 ...
- 不止代码:乘法游戏 题解(区间dp)
题目描述 乘法游戏是在一行牌上进行的.每一张牌包括了一个正整数.在每一个移动中,玩家拿出一张牌,得分是用它的数字乘以它左边和右边的数,所以不允许拿第1张和最后1张牌.最后一次移动后,这里只剩下两张牌. ...
- 【区间dp】uva10003+ uva 1626 括号匹配问题 【有空自己记忆化写一下!!!】
讲道理,其实我还不是太懂,这个题看到了两种写法 之前大概想的差不多,要这样实现呀: 常规写法,大概n--3 递归写法,稍微好理解一点 好了,接下来自从看了liuchuo的博客我要变身玛丽苏橙色了 题目 ...
- POJ 2955 Brackets (区间DP)
题目链接:http://poj.org/problem?id=2955 Brackets Time Limit: 1000MS Memory Limit: 65536K Total Submiss ...
- HDU 5115 Dire Wolf ——(区间DP)
比赛的时候以为很难,其实就是一个区间DP= =..思路见:点我. 区间DP一定要记住先枚举区间长度啊= =~!因为区间dp都是由短的区间更新长的区间的,所以先把短的区间更新完.. 代码如下: 1 #i ...
- 编程之美2015资格赛 题目2 : 回文字符序列 [ 区间dp ]
传送门 题目2 : 回文字符序列 时间限制:2000ms 单点时限:1000ms 内存限制:256MB 描述 给定字符串,求它的回文子序列个数.回文子序列反转字符顺序后仍然与原序列相同.例如字符串ab ...
- 动态规划——区间dp
在利用动态规划解决的一些实际问题当中,一类是基于区间上进行的,总的来说,这种区间dp是属于线性dp的一种.但是我们为了更好的分类,这里仍将其单独拿出进行分析讨论. 让我们结合一个题目开始对区间dp的探 ...
- HDU 5115 Dire Wolf 区间dp
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5115 Dire Wolf Time Limit: 5000/5000 MS (Java/Others ...
- HDU 5693 D Game 区间dp
D Game 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5693 Description 众所周知,度度熊喜欢的字符只有两个:B 和D. 今天,它 ...
最新文章
- Redis数据结构之字符串
- 课后作业-阅读任务-阅读提问-4
- TensorFlow机器学习实战指南之第二章
- 死锁的产生原因和解决办法
- word中表格加粗某一行
- Daily Scrum 10.23
- robot---百度百科
- 区块链“搅局”中介风云
- 【爆肝帝,花费3个月整理】金九银十面试季,2020-2021字节跳动所有,软件测试面试题拿走不谢!(附详细答案解析)
- 戴尔服务器加无线网卡用不了网,电脑安装了无线网卡却不能用是怎么回事?
- 雅虎邮箱 转发设置_如何在Yahoo Mail中设置外出答复
- Linux 进程查看命令 ps top htop dstat
- vue打印数据,可分页打印
- 建文高考成绩查询2021,深圳市建文外国语学校2020年高考喜报
- 文件上传黑名单和白名单校验
- 拿到软考高级证书就是高级职称了吗?
- 【毕业设计】天气数据分析系统 - python 大数据
- 更改服务器网站默认端口,更改服务器默认端口号
- 记录一篇Spring 5的WebClient 的 重试问题
- 《自然语言处理:基于预训练模型的方法》读书笔记:第2章 自然语言处理基础