关于近期oj上做题的整理[2]

来源:互联网 发布:java实现图书管理系统 编辑:程序博客网 时间:2024/05/22 10:48


29、购物单

很经典的一道题,媳妇刚看这题的时候说是什么背包问题,额,应该看做一个带有多个权的复杂背包问题,最后变成一个n的n次方的背包问题,精妙之处在于,本来物品的选择时要考虑先后情况这个问题的,但是如果把某中类型的所有情况进行讨论,即把不选也作为一种情况讨论,就回避了全排列问题,很好的一个思路


30、简单错误记录

题目本身没什么,但是这个题目有个启发,就是怎样构建一个方便的数据结构,一条信息,有个是真实信息,有个事供比较索引的信息,有个是显示信息,后面在很多变种字典问题中用的都是这个思想


31、记负均正


32、计算字符串距离

这题网上有答案的,不过我当时傻傻的自己写了,网上算法没仔细看,我的思路就是,找到小的字符串与大的字符串相同的最多的部分,找的方法,就是把小的字符串进行细-切割,额,应该是个笨方法吧

ps:隐隐感觉字母类一些比较累的题,可以通过隐藏哈希表结合带权值图论问题进行解决


33、最大数

数组约等于哈希表的典型应用


34、卡布列克常数

简单递归,但是当时的递归真的很不成熟!!!!


35、拼音翻译成阿拉伯字母

哎,最后没时间了,对string的函数应用要熟练,特别是find和substr结合扣字符


36、简单棋盘格子走法

简单递归即可


37、查找兄弟单词

前面提到的字典类型的题目,但是没有变种


38、单词倒排

简单的gets转多个string的题目,我就觉得有的题目就是简单的信息提取部分都比这个难,但是仍然自称中级题,这样好吗。。。


39、矩阵乘法计算量估算


40、计算日期到天数的换算

很好的题目,所有关于日期换算的题目都可以用到,用这个做个万年历都行,所有类似的题目核心都是判断闰年if(((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0))


41、成绩排序

30中提到思想的简单应用


42、梅花桩走法

一个典型的递归类型问题,并且是一个求最大升序问题,很多问题都会简介用到这个思想,后面的胜负猜想那个题目也是用到了这个

其中有些思考:关于递归函数的类型和结束条件问题,这题中其实递归函数的类型是无关轻重的,因为必然要把所有可能性都走一遍才能得出最终的结论,那些条件只是可能性出口的约束条件,而不是递归过程的结束条件,当然是如果看做一次不进行约束的递归,而把约束条件看做返回为false的结束条件,那么是否更好,更正统呢,后面的胜负猜想问题需要对递归进行一个系统的认识


43、迷宫问题

A星算法的简洁版,和上面一样都是递归问题,也存在同样的问题,就是错吧结束条件当做了约束条件,虽然最后很顺利的写出来了,但也为后来胜负猜想题目困局埋下伏笔

ps:好吧,经过一些总结,之前以为很熟练的递归发现很多方法都是土包子方法,很多都是不可取的,重新看了一遍,发现都是可更改的,再看一遍,这样挺好


44、删除特殊字符


45、字符串识别和过滤


46、按自己截取字符串(汉字)


47、挂号机

用了一个很简单的机构提数组,就两个bool型的成员,是否被叫到,是否被用到,剩下的就是,分析指令操作这个结构体数组了,比较简单


48、状态机

我认为我写出来了,结果连一个case都没过。。。,坑啊,这个题的数据存取上有个键值的,就是那个条件,在用个存当前状态,剩下的就是分析指令,查找遍历,修改记录了,这个也比较简单 


49、胜负猜想

先回忆一下题目吧:有一组给定的一串有序数字,甲乙两人依次删除数字,如果最后数字是递增排序的,那么甲获胜,否则失败,两人都是极聪明的,不会犯错

好吧,至少在我眼里是一个递归题目,题目有意思的地方就在于,“两人都是极聪明的这个条件上”,意思就是两人都是高瞻远瞩的,能走对的绝不会走错的,都是象棋能心算十几手的国手,好吧,那么题目应该可以这样理解,如果甲先下,他下得每一步棋,都要考虑到乙的所能做到的最好情况,这样很抽象,那么这样说,就是甲把当前可以下得每一种可能都做一下尝试,然后轮到乙走,乙走的时候,乙会考虑甲的所有可能,做出最有利与最后的解,问题的结果就像象棋中的残局,如果可以赢,不管对手怎么防,都是可以赢得。

扯远了,那这个递归就是个有意思的过程了,额,有点像三体里面罗辑的猜疑链问题。。。

额,用我拙劣的语言来叙述一下这个递归过程吧,哪怕以后看见能回忆点也好。。。:甲删除任意一个,如果删除这一个后,乙无论如何删除都不能使作为判定条件的递归过程返回false,难么整个函数返回false,有一种可能就返回true。好吧,连这个过程都是递归的,太绕了,当时写出来之后有种顿悟的感觉,感觉对递归有种抓到什么的感觉,还是看代码吧

附上代码

#include <iostream>
#include <string>
#include <vector>
#include <stdio.h>
#include <algorithm>
using namespace std;


bool bEnd = false;
bool f1(vector<int> vData, int nIndex)
{
if(vData.size() == 2)
{
return false;
}
vData.erase(vData.begin()+nIndex);
bool bSuit = true;
for(int i = 1;i < vData.size();i++)
{
if(vData[i] <= vData[i-1])
{
bSuit = false;
}
}
return bSuit;
}


bool f4(vector<int> vData)
{


bool bSuit = true;
for(int i = 1;i < vData.size();i++)
{
if(vData[i] <= vData[i-1])
{
bSuit = false;
}
}
return bSuit;
}


bool f2(vector<int> vData)
{
for(int i = 0;i < vData.size();i++)
{
if(f1(vData,i) == true)
{
return true;
}
}
return false;
}


bool f3(vector<int> vData,int nIndex,bool bJia)
{
if(vData.size() == 1)
{
return false;
}
if(f2(vData) == true && bJia == true)
{
return true;
}
if(f4(vData) == true && bJia == true)
{
return true;
}
vData.erase(vData.begin()+nIndex);
bool bRet = false;
for(int i = 0;i < vData.size() && bJia == true;i++)
{
bRet = f3(vData,i,!bJia);
if(bRet == true)
{
return true;
}
}
bool bEnter = false;
for(int i = 0;i < vData.size() && bJia == false;i++)
{
if(f3(vData,i,!bJia) == true)
{
continue;
}
f3(vData,i,!bJia);
bEnter = true;
}
if(bEnter == false)
{
return true;
}
}


int main()
{
string str;
cin>>str;
vector<int> vData;
for(int i = 0;i < str.length();i++)
{
char cTemp[2] = {0};
cTemp[0] = str[i];
int num = atoi(cTemp);
vData.push_back(num);
}
for(int i = 0;i < vData.size();i++)
{
bool bRet = f3(vData,i,false);
if(bRet == true)
{
cout<<1;
return 0;
}
}
cout<<0;

return 0;
}


菜鸟在路上,多努力,多努力

0 0