当前位置: 首页 > news >正文

DP类(动态规划)

最大序列和

查看题解 查看答案

题目描述

Time Limit: 1000 ms
Memory Limit: 32768 mb

给出一个整数序列S,其中有N个数,定义其中一个非空连续子序列T中所有数的和为T的“序列和”。 对于S的所有非空连续子序列T,求最大的序列和。 变量条件:N为正整数,N≤1000000,结果序列和在范围(-2^63,2^63-1)以内。

输入输出格式
输入描述:

第一行为一个正整数N,第二行为N个整数,表示序列中的数。

输出描述:

输入可能包括多组数据,对于每一组输入数据, 仅输出一个数,表示最大序列和。

输入输出样例
输入样例#:

复制

5 1 5 -3 2 4 6 1 -2 3 4 -10 6 4 -3 -1 -2 -5
输出样例#:

复制

9 7 -1
题目来源
清华大学/兰州大学机试题
#include<bits/stdc++.h> using namespace std; #define N 1000005 #define P 1000000007 long long s[N]; int main(){ int n; while(cin >> n){ long long dp[n]; for(int i = 0; i < n; i ++){ cin>>s[i]; dp[0] = s[0]; dp[i] = max(dp[i - 1] + s[i], s[i]); } long long m = -10000000; for(int i = 0; i < n; i ++){ m = max(m, dp[i]); } cout<<m<<endl; } }

最大子串和

查看题解 查看答案

题目描述

Time Limit: 1000 ms
Memory Limit: 256 mb

输入n个整数的序列,求它的最大子串和,并输出对应的数。

输入输出格式
输入描述:

多组测试数据。 第一行输入一个整数n(0<n<=100)。 接下来一行输入n个数用空格隔开,保证每个数的绝对值小于1000。

输出描述:

第一行输出所求子串的序列,如果有多个答案,输出靠前的答案。 第二行输出最大子串和。

输入输出样例
输入样例#:

复制

5 -10 5 2 -8 7
输出样例#:

复制

5 2 7
题目来源
厦门大学复试机试题
#include<bits/stdc++.h> using namespace std; #define N 1000005 #define M -1000005 #define P 1000000007 long long s[N]; int main(){ int n; while(cin>>n){ int start = 0, end = 0;//记录 int temp = 0;//临时起点 for(int i = 0; i < n; i ++){ cin>>s[i]; } // dp[0] = s[0]; long long m = s[0], sum = s[0]; for(int i = 1; i < n; i ++){ // dp[i] = max(dp[i - 1] + s[i], s[i]); if(sum < 0){//重新开始 sum = s[i]; temp = i; } else{//继续累加 sum += s[i]; } if(sum > m){//最大值有变化 m = sum; start = temp; end = i; } }// for(int i = start; i <= end; i ++){ if (i > start) cout << " "; cout<<s[i]; } cout<<endl; cout<<m<<endl; } }

最大连续子序列

查看题解 查看答案

题目描述

Time Limit: 1000 ms
Memory Limit: 256 mb

给定K个整数的序列{ N1, N2, ..., NK },其任意连续子序列可表示为{ Ni, Ni+1, ..., Nj },其中 1 <= i <= j <= K。最大连续子序列是所有连续子序列中元素和最大的一个,例如给定序列{ -2, 11, -4, 13, -5, -2 },其最大连续子序列为{ 11, -4, 13 },最大和为20。现在增加一个要求,即还需要输出该子序列的第一个和最后一个元素。

输入输出格式
输入描述:

测试输入包含若干测试用例,每个测试用例占2行,第1行给出正整数K( K< 10000 ),第2行给出K个整数,中间用空格分隔。当K为0时,输入结束,该用例不被处理。

输出描述:

对每个测试用例,在1行里输出最大和、最大连续子序列的第一个和最后一个元素,中间用空格分隔。如果最大连续子序列不唯一,则输出序号i和j最小的那个(如输入样例的第2、3组)。若所有K个元素都是负数,则定义其最大和为0,输出整个序列的首尾元素。

输入输出样例
输入样例#:

复制

6 -2 11 -4 13 -5 -2 10 -10 1 2 3 4 -5 -23 3 7 -21 6 5 -8 3 2 5 0 1 10 3 -1 -5 -2 3 -1 0 -2 0
输出样例#:

复制

20 11 13 10 1 4 10 3 5 10 10 10 0 -1 -2 0 0 0
题目来源
浙江大学/中国矿业大学/暨南大学机试题
#include<bits/stdc++.h> using namespace std; //1. 全局大数组,防栈溢出 const int MAXN = 1000005; long long s[MAXN]; long long dp[MAXN]; int main() { int k; while(cin >> k){ if(k == 0){ break; } bool negative = true; for(int i = 0; i < k; i ++){ cin>>s[i]; if(s[i] >= 0){ negative = false; } } // for(int i = 0; i < k; i ++){ // cout<<s[i]<<" "; // } // cout<<endl; int start = 0, end = 0;//记录最大的 int temp = 0;//记录临时的起点 注意初始化!!!! int sum = s[0], m = s[0]; for(int i = 1; i < k; i ++){ if(m < 0){//小于0就从i这里重新开始 m = s[i]; temp = i; } else{//大于0就一直累加 m = m + s[i]; } if(m > sum){//当前的最大值超过之前的那个了 sum = m; start = temp; end = i; } } if(negative){ cout<<"0"<<" "<<s[0]<<" "<<s[k - 1]<<endl; } else{ cout<<sum<<" "<<s[start]<<" "<<s[end]<<endl; } } }

字符串区间翻转

查看题解 查看答案

题目描述

Time Limit: 1000 ms
Memory Limit: 256 mb

小诺有一个由0和1组成的字符串
现在小诺有一次机会,可以选择一个任意的区间[L,R],将该区间内的所有字符串进行翻转(即0->1,1->0)。
请问小诺经过一次翻转之后字符串中最多会有多少个1?

输入输出格式
输入描述:

第一行输入一个正整数n,表示字符串长度,n<=10^7。 接下来一行一个输入一个01字符串。 可能有多组测试数据输入。

输出描述:

输出题目要求的答案。

输入输出样例
输入样例#:

复制

4 1001
输出样例#:

复制

4
题目来源
杭州电子科技大学/南京大学机试题
#include<bits/stdc++.h> using namespace std; char s[1000005]; int main(){ long long n; string str; while(cin>>n){ cin>>str; vector<int>result(n); for(int i = 0; i < n; i ++){ if(str[i] == '0'){ result[i] = 1; } else{ result[i] = -1; } } // for(int i = 0; i < n; i ++){ // cout<<result[i]<<" "; // } // cout<<endl; int start = 0, end = 0; int temp = 0; int m = result[0], sum = result[0]; for(int i = 1; i < n; i ++){ m = max(m + result[i], result[i]); sum = max(m, sum); // if(m < 0){ // m = result[i]; // temp = i; // } // else{ // m = m + result[i]; // } // // if(m > sum){ // sum = m; // start = temp; // end = i; // } } // cout<<sum<<endl; int count = 0; for(int i = 0; i < n; i ++){ if(str[i] == '1'){ count ++; } } if(sum < 0){ cout<<count<<endl; } else{ cout<<sum + count<<endl; } } }
http://www.jsqmd.com/news/498741/

相关文章:

  • 戴森球计划终极蓝图库:如何快速提升工厂效率300%的完整指南
  • Java Web 拦截机制实战指南:Filter 与 Interceptor 深度解析
  • ZLMediaKit编译webrtc:从依赖版本到端口映射的实战避坑指南
  • 手把手教你用GLM-OCR:从安装到解析,新手避坑指南
  • Phi-4-reasoning-vision-15B效果展示:同一张财务报表,三种推理模式输出差异对比
  • WSL2新手必看:VcXsrv配置xfce4图形界面的5个常见错误及解决方法
  • 灯光已就位!马来西亚「敦泰益玛目大桥」亮化项目全面竣工!itc投光灯、洗墙灯照亮市民幸福路!
  • CLIP-GmP-ViT-L-14图文匹配测试工具企业运维指南:高可用部署与监控
  • 通义千问3-4B优化技巧:如何写出更好的Prompt来生成高质量代码
  • 6-2一帮一
  • 经营机制方法拆解:从判断到落地的完整框架
  • Web Builder可视化拖拽构建工具:从零到一的完整前端解决方案
  • 戴森吸尘器电池复活终极指南:开源固件解锁隐藏功能,告别32次红灯闪烁
  • ChatGLM3-6B-128K效果对比:与标准版8K模型实测差异
  • 网盘资源搜索工具使用体验分享
  • SiameseAOE中文-base参数详解:StructBERT微调与Pointer Network结构精讲
  • 性能优化工具矩阵:从系统瓶颈到效率提升的全栈解决方案
  • IACheck融合AI审核:花卉种植记录报告如何实现高精度合规审查?
  • 音乐播放器个性化定制:三步实现foobar2000体验升级
  • 从零配置VSCode+C++调试环境(附gdb常用命令速查表)
  • 2026年中文内容生成实测:Gemini 3.1与GPT-5.4的语言风格分野
  • 计算机毕业设计springboot基于Web的跨平台高校失物招领管理系统 SpringBoot框架驱动的校园物品遗失与寻回智能服务平台设计与实现 基于Java Web的大学校园失物信息聚合与匹配系统开
  • LiuJuan Z-Image Generator镜像免配置:一键拉取即启,告别CUDA环境踩坑
  • 3种效率倍增方案:Mac Mouse Fix鼠标驱动深度配置指南
  • Outfit字体使用规范
  • Mathtype公式轻松转LaTeX:Nanbeige 4.1-3B格式转换工具展示
  • 银行卡三要素接口对接常见问题汇总
  • 计算机毕业设计springboot基于Web的健身会员管理系统 SpringBoot框架驱动的健身俱乐部数字化运营平台设计与实现 基于Java Web的体育运动中心会员服务系统开发
  • 探索参数化设计:从原理到实践的高效精准创新设计指南
  • Java 养老陪护小程序:用户端 + 护理端 + 后台管理完整开发