第一次AK,第一次写题解。题目较简单,稍微记录下思路。
题目1:棋盘寻宝
入门级的动态规划题
dp[i][j]为到i行j列的最大值,逐行逐列计算即可。时间o(n^2)
#include<iostream> #include<cstring> using namespace std; int main(){ int i,j,k,a[9][9],dp[9][9]; memset(dp,0,sizeof(dp)); while(cin>>a[1][1]){ for(i=2;i<=8;i++) cin>>a[1][i]; for(i=2;i<=8;i++) for(j=1;j<=8;j++) cin>>a[i][j]; for(i=1;i<=8;i++) for(j=1;j<=8;j++) dp[i][j]=a[i][j]+max(dp[i][j-1],dp[i-1][j]); cout<<dp[8][8]<<endl; } }
题目2:最长不重复子串
由经典问题“最大子段和”想到的思路。
flag[i]记录各个字母首次出现的位置。
遍历该串,当遇到的字符从未出现过时:计数器t++并且记录当前位置。
否则:浮标回退到上次出现的位置的下一个,如果计数器t比ans大则更新ans,并将t置零flag初始化。
思路很简单。比如“sasd”。
"s" t=1
"a" t=2
"s" 出现过,i回退到“a”, ans=2,t=1
“s” t=2
"d" t=3
ans=3
由于最坏情况下遍历串26次,时间o(n)
代码如下
#include<iostream> #include<cstring> using namespace std; int main(){ int flag[26]; char s[10005]; while(cin>>s){ memset(flag,-1,sizeof(flag)); int i,t,ans=1; for(t=i=0;s[i];i++){ if(flag[s[i]-'a']==-1){ t++; flag[s[i]-'a']=i; }else{ i=flag[s[i]-'a']; memset(flag,-1,sizeof(flag)); if(t>ans)ans=t; t=0; } } if(t>ans)ans=t; cout<<ans<<endl; } }
题目3:货币面值
0-1背包问题,用一维数组可以简化代码,思路如下
dp[i]=1表示面值i可以被表示,遍历输入的数组a[i],如果dp[j-a[i]]可以被表示,那么dp[j]也应该可以被表示。
01背包一维数组解法不需要sort排序,但有一点要注意,此解法中dp[j]数组一定要倒序遍历。
为方便处理,设置哨兵dp[0]=1。
代码如下:
#include<iostream> #include<cstring> using namespace std; int main(){ int n,a[105],dp[10005]; while(cin>>n){ memset(dp,0,sizeof(dp)); dp[0]=1; int m=0; for(int i=0;i<n;i++){ cin>>a[i]; m+=a[i];//m记录所有数值的总和,用以优化后边的循环 } for(int i=0;i<n;i++) for(int j=m;j>=a[i];j--)//此循环一定要倒序遍历 dp[j]|=dp[j-a[i]]; for(int i=1;i<10005;i++) if(!dp[i]){ cout<<i<<endl; break; } } }
题目4:棋盘寻宝扩展
此题应该有较好的解法,原想从第一题的代码基础上拓展的,但是越改问题越多,遂放弃。
情急之下,暴力解决了。还是那句老话,能暴力的最好别想太多,脑力复杂度是0。
dp[i]记录所有路径到达终点时得总价值,如dp[i]==1表示能取到总价值为i。
递归比较简单,只是往右和往左的分支。
还有个比较重要的剪枝,就是判断当前价值是否大于limit,若超出则结束递归。
代码如下:
#include<iostream> #include<cstring> using namespace std; int limit,a[9][9],dp[1505]; void Bice(int i,int j,int w){ if(w>limit)return;//剪枝 if(i==8&&j==8){ dp[w]=1; return; } if(i<8)Bice(i+1,j,w+a[i+1][j]); if(j<8)Bice(i,j+1,w+a[i][j+1]); } int main(){ int i,j; while(cin>>limit){ memset(dp,0,sizeof(dp)); for(i=1;i<9;i++) for(j=1;j<9;j++) cin>>a[i][j]; Bice(1,1,a[1][1]); for(i=limit;i;i--) if(dp[i]){ cout<<i<<endl; break; } if(i==0) cout<<"-1\n"; } }
相关推荐
【标题】"2019最新三维九度分销源码下载"所涉及的知识点主要集中在电商领域的分销系统和源码开发上。分销源码是指用于构建分销系统的编程代码,它是电商平台的重要组成部分,允许商家通过多级分销模式进行产品销售和...
使用vs2010编写,直接用vs2010打开加压后的.sln文件即可看到...九度OJ上面的剑指Offer习题全套答案,全部AC,且具有较好的时间复杂度。部分参考网络上的idea,但代码已经尽量要求简洁,是OJ练习不可多得的参考代码。
九度智能seo优化软件是一款针对搜索引擎的点击类软件。软件适用于百度、谷歌、360搜索、搜狗、搜搜、淘宝、天猫等等搜索引擎,可以用来提高...绝对是专业人士必备的seo优化软件,您值得拥有! 九度智能seo优化软件截图
【标题】"Thinkphp三维九度分销新玩法微信三三复制直销系统源码"涉及到的是一个基于ThinkPHP框架开发的微信分销系统,该系统采用了一种独特的“三维九度”分销模式,即三三复制直销策略。在互联网营销中,这种模式...
8.目标网页随机停留数秒后自动关闭; 9.目标网页随机位置、随机二次点击、深入点击,效果更真实; 10.随自己点击意愿和预期,设置日最大点击量和每一个小时内的最大点击量; 11.免费。挂机赚到一定的积分后即可...
百度、腾讯、阿里剑指offer、九度OJ等面试笔试题的代码实现 语言C_C++_python.zip
王道论坛发布的《2013年王道论坛计算机考研机试指南pdf》是一本专门针对计算机专业研究生入学考试的机试环节编写的指南书。机试是考查计算机专业研究生必不可少的环节,它主要通过上机编程的方式,测试考生分析问题...
在编写程序时,你需要读取"input.txt"中的数据,解析成树结构,然后找出LCA,最后将结果与"output.txt"中的期望结果进行比较,以验证算法的正确性。 在实际编程过程中,需要注意数据的输入格式,如节点间的关系可能...
【三维九度分销新玩法源码】是一种在电商和网络营销领域常见的销售策略,它结合了三维营销和九度分销的概念,旨在通过多层次的分销体系来扩大销售网络,提高产品的覆盖范围,并激励分销商积极参与销售活动。...
8.目标网页随机停留数秒后自动关闭; 9.目标网页随机位置、随机二次点击、深入点击,效果更真实; 10.随自己点击意愿和预期,设置日最大点击量和每一个小时内的最大点击量; 11.免费。挂机赚到一定的积分后即可...
本系统为Online Judge 系统,可广泛用于教学、竞赛、招聘等用途。 九度OJ为本系统改造的典型案例。 文档、社区服务见项目首页,http://code.google.com/p/hustoj/ 安装应用 下载应用安装包 应用首页 HUSTOJ特性 ...
九度OJ八皇后问题,主要是主对角线和副对角线的判断上面优化。在九度1140上面已经AC
ZJU考研机试真题 九度1006ZOJ问题
九度智能SEO优化软件是九度搜索引擎点击优化软件重新开发版,本是针对搜索引擎的SEO优化类软件,2016年10月正式上线。软件可像真人点击一样,自动点击百度、谷歌、360搜索、搜狗、搜搜、淘宝、天猫等搜索引擎内的...
九度Online Judge部分题解 RefreshCsdnBlog 刷新博客访问量 SeeNewsJsp JSP+Servlet实现的新闻爬虫 ParseArticleDataDemo 在 SeeNewsJsp 基础上重构的爬虫 ThreeNodeMiniAuto 简单的自动化测试:检查配置、切换模式...
《九度火鸟的许愿树》是一款基于Web的贺卡制作系统,其核心功能包括数据连接、数据删除以及数据库管理。在这个系统中,conn.asp是用于建立与数据库连接的关键文件,用户可以通过修改该文件来设定站点的数据源,包括...
九度算法实现EXCEL排序 Excel可以对一组纪录按任意指定列排序。现请你编写程序实现类似功能。 对每个测试用例,首先输出1行“Case i:”,其中 i 是测试用例的编号(从1开始)。随后在 N 行中输出按要求排序后的结果...
建议在闲暇时挂机,或有多余的电脑挂机,也可以在自己的电脑上,安装虚拟机,在虚拟机上运行挂机软件,工作和挂机两不误出色功能1.由全国各地众多挂机者自动点击,流量来源分布广泛而合理;2.点击逼真,点击过程完全...