1.大富翁游戏,玩家根据骰子的点数决定走的步数,即骰子点数为1时可以走一步,点数为2时可以走两步,点数为n时可以走n步。求玩家走到第n步(n<=骰子最大点数且是方法的唯一入参)时,总共有多少种投骰子的方法。
这一题可以用归纳法:
n=1,有1种可能,即f(1)=1
n=2,有2种可能,即f(2)=2
n=3,有4种可能,即f(3)=4
归纳一波:f(n) = f(n-1)+f(n-2)+f(n-3)+....+f(1)+1,f(1)=1,f(2)=2.则f(n)=2^(n-1).
#include <iostream>
#include <math.h>
using namespace std;
int main()
{
int n;
int ans;
scanf("%d",&n);
ans = pow(2,n-1);
printf("%d",ans);
return 0;
}
所以答案可以直接设置为2^(n-1),可以轻松算出答案。
2.给你六种面额 1、5、10、20、50、100 元的纸币,假设每种币值的数量都足够多,编写程序求组成N元(N为0~10000的非负整数)的不同组合的个数。
#include<iostream>
using namespace std;
int main()
{
int coin[6] = { 1,5,10,20,50,100 };
int N; cin >> N;//输入N元
int* dp = new int[N+1]();//可以让数组0到N
dp[0] = 1;
for (int i = 0; i < 6; i++)//使用交易后计算,使用1,2,3,4,5,6面值的数量
{
for (int r = coin[i]; r <= N; r++)
{
dp[r] = dp[r] + dp[r - coin[i]];
}
}
cout << dp[N];
return 0;
}
3.给定一组非负整数组成的数组h,代表一组柱状图的高度,其中每个柱子的宽度都为1。 在这组柱状图中找到能组成的最大矩形的面积(如图所示)。 入参h为一个整型数组,代表每个柱子的高度,返回面积的值。
我的思路时算出每一个柱子作为基础,来算其可延申的矩形的面积,存入multiset容器中最后输出最大的值,时间复杂度会大一些。
#include<iostream>
#include<vector>
#include<set>
using namespace std;
//就算可以延申x方向的长度
int Length(vector<int>v,int i)
{
int len = 1;
int a = i -1 ;int b = i + 1;
while (a>=0&&v[a] >= v[i])//向左延申的长度
{
a--;
len++;
}
while (b <= v.size()-1 && v[b] >= v[i])//向右延申的长度
{
b++; len++;
}
return len;
}
int main()
{
int num; cin >> num;
vector<int> v;
for (int i = 0; i < num; i++)
{
int p; cin >> p;
v.push_back(p);
}
multiset<int>s;
for (int i = 0; i < num; i++)
{
int ret = v[i] * Length(v, i);//当前面积
s.insert(ret);//存入当前面积到set容器中
}
cout << *s.rbegin();
return 0;
}
4给出两个字符串(可能包含空格),找出其中最长的公共连续子串,输出其长度。
最直接的思路可以设置两个字符串string a,b;第一个a可以算出所有的字串,在b中查询,并记录最大长度。
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
string a,b;
getline(cin,a);
getline(cin,b);
int Max=0;
if(a.empty()||b.empty()) cout<<0<<endl;
for(int i=0;i<a.size();i++)
{
for(int j=i;j<a.size();j++)
{
string c=a.substr(i,j-i+1);
if(b.find(c)!=-1)
{
int temp=c.length();
Max=max(Max,temp);
}
}
}
cout<<Max<<endl;
return 0;
}