计算斐波那契数列的值,n最大为45所以不用高精度直接用long long肯定可以存下。
#include
#include
long long int a[50];
using namespace std;
int main() {
int n;
scanf("%d",&n);
a[1]=1*1ll;//斐波那契数列中第一个第二个没法从前面推出所以先赋值。
a[2]=2*1ll;
for(int i=3;i<=n;i++)
{
a[i]=a[i-1]+a[i-2];
}
printf("%lld",a[n]);
}
每一次都面临要上几次台阶的问题,一共有三种选择。使用深度优先搜索来做这道题。每一个传递的参数n是还剩几个台阶,只有最后所有的台阶都走完了才能算一种方案。递归return的条件是n为0或者是负数的情况。
#include
#include
using namespace std;
int sum=0;
int dfs(int n)
{
if(n==0)//剩余台阶数等于零的时候
{
sum++;//方案数自增一
return 0;
}
else if(n>0)
{
dfs(n-1);
dfs(n-2);
dfs(n-3);
}
return 0;
}
int main() {
int n;
scanf("%d",&n);
dfs(n);
printf("%d",sum);
}
这道题参考链接:C题骨牌铺方格题解
每一次将绳子分为三段这三段必须都是整数,选取中间的一段继续分割。一直分割小于等于2m,问这个绳子最长是多少。
反向思考给定一个绳子让操作数最多那么最短绳长为1m,然后最长绳长等于第二长的绳长或者只比第二长绳子多一。递推公式为: f f f( x x x)=max{ f f f( x x x-1)+ f f f( x x x-1)+1, f f f( x x x-1)+ f f f( x x x-1)+1+1},整理后得出 f f f( x x x)= f f f( x x x-1)+ f f f( x x x-1)+2.
#include
#include
using namespace std;
long long int a[50];
int main() {
int n;
scanf("%d",&n);
a[0]=2;//递推开始
for(int i=1;i<=n;i++)
{
a[i]=a[i-1]+a[i-1]+2;
}
printf("%lld",a[n]);
}
这题考虑的是最差情况,即每道题的正确答案都是最后一个选项,所以第 i i i题选 a i a_i ai次才能选到正确答案.所以每一次都需要 a i a_i ai-1次试错。而每一次试错都需要把前面的 i i i-1次正确答案重新选择一遍。所以递推公式为:
f i f_i fi= f i − 1 f_{i-1} fi−1+ a i a_i ai+( a i a_i ai-1)*( i i i-1)
f i f_i fi表示第 i i i次选出正确答案的选题次数。
ans += a[i] + (a[i] - 1) * (i - 1) //ans代表前i - 1道题的选择总数
#include
using namespace std;
long long a[110], ans = 0;
int main(){
int n;
cin >> n;
for(int i = 1; i <= n; i++)
cin >> a[i];
for(int i = 1; i <= n; i++)
ans += a[i] + (a[i] - 1) * (i - 1);
cout << ans;
return 0;
}
对于每个格子,能走的路径只有下和右,所以 对于每个格子路径数为上和左路径数的和。但是由于有障碍所以有些点需要特判一下。dp [ i i i][ j j j]为到达( i i i, j j j)点的方案数,如果这个点是障碍点dp[ i i i][ j j j]=0,如果不是障碍点则满足如下方程:dp[ i i i][ j j j]=dp[ i i i-1][ j j j]+dp[ i i i][ j j j-1]
#include
#include
#include
using namespace std;
int dp[1005][1005];
bool map[1005][1005];
int main() {
int n,m;
memset(map,true,sizeof(map));
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
int x,y;
scanf("%d%d",&x,&y);
map[x][y]=false;
}
if(map[1][1]==true)
dp[1][1]=1;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(map[i][j]==true)
{
dp[i][j]=max((dp[i-1][j]+dp[i][j-1]),dp[i][j]);
dp[i][j]=dp[i][j]%100003;
}
}
}
printf("%d",dp[n][n]);
}
这道题的题解点这里,绝对不是我懒的写的原因