标签:27 奇数 题解 aj 个数 偶数 110 2019.10 序列
【题目A】:
【题目】:
有很多东西是可以被切割的,比如——树、纸张或者绳子。在这道题目里面你需要切割一个整数序列。
现在告诉你一个整数序列,在这个整数序列里面有一些数,它们可能是奇数,也可能是偶数。
给你一个固定的预算(因为切割是有成本的),你需要竟可能多地将这个整数序列切分成一系列连续子序列,
使得每一个连续子序列中的 奇数元素的个数 和 偶数元素的个数 相同。
比如,给你一个整数序列 [4,1,2,3,4,5,4,4,5,5] ,你可以将其切割两次变成 [4,1∣2,3,4,5∣4,4,5,5] 。其中,[4,1] 、 [2,3,4,5] 以及[4,4,5,5] 这三个连续子序列中包含的奇数个数等于偶数个数。
如果你要将第 i 个元素和第 i+1 个元素之间切一刀,我们假设第 i 个元素对应的数值为 x ,第 i+1 个元素对应的数值为 y ,那么你需要消耗 ∣x−y∣ 个比特币。(∣x−y∣ 表示 x−y 的差的绝对值)。
而你的预算只有 B 个比特币,所以你需要计算一下在最多消耗 B 个比特币的情况下,你最多可以切几次。
【思路】: 记fi,k表示前i个数且有k个比特币时最多可以切割多少刀。所以我们可以得到如下的dp方程:fi,k=fj,k−∣aj−aj−1∣+1,其中j<i,k≥∣aj−aj−1∣,且区间[i,j]中奇数个数等于偶数个数。而奇数个数和偶数个数可以用前缀和求出。根据定义,答案即为fn,B
【代码】:
#include <bits/stdc++.h>
using namespace std;
int f[110][110],a[110];
int i,j,k,n,B,s[2][110];
int main(){
// freopen("t1.in","r",stdin);
scanf("%d%d",&n,&B);
for(i=1;i<=n;i++){
scanf("%d",&a[i]);
s[a[i]%2][i]=s[a[i]%2][i-1]+1;
}
for(i=2;i<=n;i++)
for(j=1;j<i;j++)
if (s[0][i]-s[0][j-1]==s[1][i]-s[1][j-1])
for(k=abs(a[j]-a[j-1]);k<=B;k++)
f[i][k]=max(f[i][k],f[j-1][k-abs(a[j-1]-a[j])]+1);
printf("%d",f[n][B]);
return 0;
}
标签:27,奇数,题解,aj,个数,偶数,110,2019.10,序列 来源: https://blog.csdn.net/ZHUYINGYE_123456/article/details/102766190
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。