算法分析6

1.题目描述

有一头母牛,它每年年初生一头小母牛。每头小母牛从第四个年头开始,每年年初也生一头小母牛。请编程实现在第n年的时候,共有多少头母牛?

输入

输入数据由多个测试实例组成,每个测试实例占一行,包括一个整数n(0<n< 55)n的含义如题目中描述。
n=0
表示输入数据的结束,不做处理。

输出

对于每个测试实例,输出在第n年的时候母牛的数量。
每个输出占一行。

样例输入

2
4
5
0

样例输出

2
4
6

#include<iostream>

using namespace std;

int main()

{

   int n;

   while(cin>>n)

   {

       if(n==0)break;

       int a,b,c,d;   //分别代表一岁二岁三岁四岁及其以上的母牛的数目。

       if(n<=4)cout<<n<<endl;  //若n<=4,很容易得出总数为n

       else{

           n=n-4;

           a=b=c=d=1;

           for(int i=0;i<n;i++)

           {

                d=c+d;//当年大母牛数目d为前一年c和d的总和

                c=b;//b母牛长了一岁到了c

                b=a;//同上

                a=d;//长成的母牛和原本的母牛共生出新的小母牛a个

           }

           cout<<a+b+c+d<<endl;

       }

    }

}

2.题目描述

相信大家小时候应该都玩过石子吧,现在有两个小孩正在玩一堆石子,他们用这些石子做一个游戏,游戏的规则是有一堆石子(n个石子),两人轮流取石子,每走一步可以取走1…m个石子,规定最先取光石子的一方为胜。现在,小孩们要你猜他们谁会赢,你能猜得出来吗?(假设两个小孩都足够聪明,都会选择最优的策略)

输入

输入数据首先包含一个正整数t(1≤t≤100),表示有t组测试数据。每组测试数据占一行,包含两个整数nm1≤n,m≤1000),nm的含义见上面的描述。

输出

如果先走的小孩能赢,请输出“first”,否则请输出“second”,每个输出占一行。

样例输入

2
23 2
4 3

样例输出

first
second
 代码:
#include<iostream>

using namespace std; 

int main(){

         intn[100], m[100];

         intt = 0;

         cin>> t;

         inti = 0;

         while(i<t){

                  cin>>n[i]>>m[i];

                  i+=1;
         }

         for(i= 0; i < t; ++i){

                  if((n[i]%(m[i]+1))== 0){

                          cout<<"second" << endl;

                  }

                  else{

                          cout<<"first"<<endl;

                  }

         }

         return0;

}

3. 题目描述

 一个给定的子序列是在该序列中删去若干元素后得到的序列。例如,序列z=<B,C,D,B> 是序列X=<A,B,C,B,D,A,B>的子序列;
  
给定两个序列XY,当另一序列Z既是X的子序列又是Y的子序列时,称Z是序列XY的公共子序列。
  
例如,若X=<A,B,C,B,D,A,B>Y=<B,D,C,A,B,A>
  
那么:<B,C,A>XY的一个公共子序列,<B,C,B,A>也是XY的一个公共子序列;
编程求出给定的两个序列中,最长公共子序列的长度。

输入

共两行,各一个字符串,第一个字符串表示第一个序列,第二个字符串表示第二个序列,两个字符串长度均小于1000

输出

一个整数,即两个序列的公共子序列的长度。

样例输入

aabaaecd
abcd

样例输出

4

// LCS.cpp : 定义控制台应用程序的入口点。

#include <string>

#include <vector>

#include <iostream> 

using namespace::std;

int lcs(string str1, string str2,vector<vector<int>>& vec) {

         intlen1 = str1.size();

         intlen2 = str2.size();

         vector<vector<int>>c(len1 + 1, vector<int>(len2 + 1, 0));

         for(int i = 0; i <= len1; i++) {

                  for(int j = 0; j <= len2; j++) {

                          if(i == 0 || j == 0) {

                                   c[i][j]= 0;

                          }

                          elseif (str1[i - 1] == str2[j - 1]) {

                                   c[i][j]= c[i - 1][j - 1] + 1;

                                   vec[i][j]= 0;

                          }

                          elseif (c[i - 1][j] >= c[i][j - 1]) {

                                   c[i][j]= c[i - 1][j];

                                   vec[i][j]= 1;

                          }

                          else{

                                   c[i][j]= c[i][j - 1];

                                   vec[i][j]= 2;

                          }

                  }

         }

         returnc[len1][len2];

}

 int main()

{

         stringstr1;

         stringstr2;

         cin>> str1;

         cin>> str2;

         vector<vector<int>>vec(str1.size() + 1, vector<int>(str2.size() + 1, -1));

         intresult = lcs(str1, str2, vec);

         cout<< result << endl;

         getchar();

         return0;

}



3. 题目描述

 一个给定的子序列是在该序列中删去若干元素后得到的序列。例如,序列z=<B,C,D,B> 是序列X=<A,B,C,B,D,A,B>的子序列;
  
给定两个序列XY,当另一序列Z既是X的子序列又是Y的子序列时,称Z是序列XY的公共子序列。
  
例如,若X=<A,B,C,B,D,A,B>Y=<B,D,C,A,B,A>
  
那么:<B,C,A>XY的一个公共子序列,<B,C,B,A>也是XY的一个公共子序列;
编程求出给定的两个序列中,最长公共子序列的长度。

输入

共两行,各一个字符串,第一个字符串表示第一个序列,第二个字符串表示第二个序列,两个字符串长度均小于1000

输出

一个整数,即两个序列的公共子序列的长度。

样例输入

aabaaecd
abcd

样例输出

4

// LCS.cpp : 定义控制台应用程序的入口点。

#include <string>

#include <vector>

#include <iostream> 

using namespace::std;

int lcs(string str1, string str2,vector<vector<int>>& vec) {

         intlen1 = str1.size();

         intlen2 = str2.size();

         vector<vector<int>>c(len1 + 1, vector<int>(len2 + 1, 0));

         for(int i = 0; i <= len1; i++) {

                  for(int j = 0; j <= len2; j++) {

                          if(i == 0 || j == 0) {

                                   c[i][j]= 0;

                          }

                          elseif (str1[i - 1] == str2[j - 1]) {

                                   c[i][j]= c[i - 1][j - 1] + 1;

                                   vec[i][j]= 0;

                          }

                          elseif (c[i - 1][j] >= c[i][j - 1]) {

                                   c[i][j]= c[i - 1][j];

                                   vec[i][j]= 1;

                          }

                          else{

                                   c[i][j]= c[i][j - 1];

                                   vec[i][j]= 2;

                          }

                  }

         }

         returnc[len1][len2];

}

 int main()

{

         stringstr1;

         stringstr2;

         cin>> str1;

         cin>> str2;

         vector<vector<int>>vec(str1.size() + 1, vector<int>(str2.size() + 1, -1));

         intresult = lcs(str1, str2, vec);

         cout<< result << endl;

         getchar();

         return0;

}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值