求该算法题的C语言编程,大佬帮帮忙,写不下去了,要能运行的

lm23 2018-09-15 01:18:47
...全文
2248 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
636f6c696e 2018-09-28
  • 打赏
  • 举报
回复
先扫描一次,将数据转换成连续D或者连续A的个数: DADDA -> 1121 然后依次从每个点计算最大连续串数 a0:1+1+2=4 a1:1+1=2 a2:2+1=3 a3:1 AAADDAADADA 2 —> 3221111 a0:3+2+2=7 a1:2+2+1=5 a2:2+1+1+1+1=6 a3:1+1+1+1=4 a4:1+1+1=3 a5:1+1=2 a6:1
立司 2018-09-27
  • 打赏
  • 举报
回复
是最大连续子序列问题。 A D可以简化成 把两种怪物理解为 1 -1 ,改变怪兽的状态可以理解为 初始值或者补偿值。
所以就是 求 1,-1,1,1 中加上初始值(查A为正值 查D为负值)的最大值或者最小值。

核心思想就是 当统计和从负到正 或者从正到负【楼上所说的翻转】,则证明之前统计的和可以舍弃。
lm23 2018-09-20
  • 打赏
  • 举报
回复
嗯嗯,还不是太懂。。。。。
幻夢之葉 2018-09-18
  • 打赏
  • 举报
回复
整个算法思想和过程如下:

选取连续的一个序列,当A或者B中一方个数较小=M,那么就暂停。
这种情况,只要反转较小数量的一方那么它们必定是连续相同的。
在此基础上,还需要判断第一个后续是否符合要变的,如果是那么就把它归到序列中,以此类推,直到不符合时停止。

举例
DADDAAD,仅有反转1次。
第一步选取连续的串变为:DADDAAD
第二步,判断第一后续即DAD,D
因为选取的序列中A和D数量相同,不管反转哪一方,都可以,那我就把D归到序列中。但是此刻D较多,即为反转后的一方
继续前进DADD,D满足反转后一方,那么归到序列中
继续前进DADDA,A不符合,停止。

最终序列为DADD,4个数。

下一次循环,从索引1开始检查……直到选取的序列未索引能到达整个序列的末尾

引用 2 楼 hehuiui 的回复:
你好,那个你是如何判断M的,就是要修改几个。
沐雨青城 2018-09-18
  • 打赏
  • 举报
回复
看起来像是求最大连续子数列的问题
lm23 2018-09-17
  • 打赏
  • 举报
回复
你好,那个你是如何判断M的,就是要修改几个。
幻夢之葉 2018-09-15
  • 打赏
  • 举报
回复
仅供参考
#include <stdio.h>
#include <string.h>

int main()
{
int N = 0, M = 0;
char buf[1024] = { 0 };
int len;
int maxHP = 0;
int start = 0, end;
int DN = 0, AN = 0;
int tmp;

scanf("%d", &N);
scanf("%d", &M);
if (N < M)
{
printf("Input error.\n");
return 0;
}

scanf("%s", buf);
len = strlen(buf);

if (len != N)
{
printf("Input error.\n");
return 0;
}

tmp = 0;
while (tmp < len)
{
if (buf[tmp] != 'D' && buf[tmp] != 'A')
{
printf("Input error.\n");
return 0;
}
++tmp;
}

while (start < len)
{
end = start;

DN = 0, AN = 0;
for (; end < len; ++end)
{
if (buf[end] == 'D')
++DN; // 统计D个数
else
++AN; // 统计A个数
if ((DN > AN ? AN : DN) == M) // 如果连续串中D和A个数最小等于M,那么立即停止
break;
}

if (DN < AN) // 反转D->A的情况
{
tmp = 'A';
}
else if (DN > AN) // 反转A->D的情况
{
tmp = 'D';
}
else // DN == AN,随便反转的情况
{
tmp = 0;
}

// 统计更后续的字符是否符合情况
while (++end < len)
{
if (tmp == 0 || tmp == buf[end])
{
tmp = buf[end];
}
else
{
break;
}
}

if (end - start > maxHP) // 此串更长,更新最大HP值
{
maxHP = end - start;
}

// 如果end已经能查找到最后,终止轮询。(继续轮询无意义,因为查找的值将不可能大于maxHP)
if (end >= len)
{
break;
}

++start;
}

printf("%d\n", maxHP);

return 0;
}

69,364

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧