数字三角形&&添加回文串&&最短排序&&字符串通配

来源:互联网 发布:淘宝一千零一夜 编辑:程序博客网 时间:2024/05/21 06:47
一、数字三角形 
    7
   3 8
  8 1 0
 2 7 4 4
4 5 2 6 5
如上图所示,从一个数字三角形的顶部走到底部有很多条不同的路径,规则是只能从当前节点走到下一层相邻的节点,即下一层的左边或右边。例如第三行第二个数字“1”只能走到第四行的第二个数字“7”与第三个数字“4”。
请寻找最佳一条路径,使得这条路径上节点的数字总和最大。

输入描述:
输入包含多组。每组数据的第一行包含一个正整数n(1≤n≤100),代表三角形的层数。紧接着有n行数字,第i(1≤i≤n)行包含i个自然数。


输出描述:
对应每组数据,输出最大的和。

输入例子:
573 88 1 02 7 4 44 5 2 6 5

输出例子:
30
典型动态规划   
#include<iostream>#include<algorithm>using namespace std;int main(){int n;while (cin>>n){int**a = new int*[n];for (int i = 0; i < n; i++)a[i] = new int[n];//输入数据for (int i = 0; i < n; i++)for (int j = 0; j <= i; j++)cin >> a[i][j];int**dp = new int*[n];for (int i = 0; i < n; i++)dp[i] = new int[n];for (int i = 0; i < n; i++)//初始化动态数组for (int j = 0; j <= i; j++) dp[i][j]=0;dp[0][0] = a[0][0];for (int i = 0; i < n - 1;i++)//从上至下的迭代for (int j = 0; j <= i; j++){dp[i + 1][j] = max(dp[i+1][j],dp[i][j]+a[i+1][j]);dp[i + 1][j + 1] = max(dp[i + 1][j + 1], dp[i][j] + a[i + 1][j + 1]);}sort(dp[n-1],dp[n-1]+n);//对最后一行进行排序cout << dp[n - 1][n - 1] << endl;//输出最大值}return 0;}

二、添加回文串

题目描述

对于一个字符串,我们想通过添加字符的方式使得新的字符串整体变成回文串,但是只能在原串的结尾添加字符,请返回在结尾添加的最短字符串。

给定原字符串A及它的长度n,请返回添加的字符串。保证原串不是回文串。

测试样例:
"ab",2
返回:"a"
每次删除掉第一个字符,将这个删除掉的字符放入一个新串中;如果删除后的字符串是回文串则返回,否则继续第一步;逆序ans返回
代码如下
#include<iostream>#include <vector>#include<string>#include <algorithm>using namespace std;bool isp(string s){//判断是否为回文串string s1=s;reverse(s.begin(),s.end());if (s1 == s)return true;else return false;}string cs(string s,int n){if (isp(s))return NULL;string s1 = "";reverse(s.begin(),s.end());//反转字符串ss1 += s.back();s.pop_back();//一次次将字符串s的首个字符剔除放入新字符串s1中while (!isp(s)){//判断剔除后的S是否为回文串s1 += s.back();//若不是,重复上过程直到是为止s.pop_back();}reverse(s1.begin(),s1.end());//反转字符串返回return s1;}int main(){string s = "abcdef";cout << cs(s,s.size()) << endl;return 0;}
三、最短排序

题目描述

对于一个无序数组A,请设计一个算法,求出需要排序的最短子数组的长度。

给定一个整数数组A及它的大小n,请返回最短子数组的长度。

测试样例:
[1,5,3,4,2,6,7],7
返回:4
[1,2,10,1,8,9],6 
返回:5

举个例子[1,5,3,4,2,6,7] 我们需要排序的范围是5到2之间,这里我们可以找出5和2的特征。2是从左向右遍历最后一个小于(它的左边部分最大值)的数字。然后是5,5是从右向左遍历最后一个大于它(右边部分最小值)的数字。通过上面的分析我们可以得到结论,从而找出这两个的位置然后相减在加上1就得到了我们的答案。
#include<iostream>#include <vector>#include<string>#include <algorithm>using namespace std;int shortsort(int *a,int n){int n1 = -1;int max = a[0];for (int i = 1; i < n; i++){//从左到右找到最后一个小于它左边最大值的数字if (a[i] < max){n1 = i;}else max = a[i];}if (n1 == -1)return 0;//如果n1的值未变则说明排序有序int m = -1;int min = a[n - 1];for (int i = n - 2; i >= 0; i--){//从右到左找到最后一个大于它右边部分最小值的位置if (a[i] > min){m = i;}else min = a[i];}return n1 - m + 1;}int main(){int a[] = {1,2,10,1,8,9};cout << shortsort(a,6) << endl;return 0;}
四、字符串通配

题目描述

对于字符串A,其中绝对不含有字符’.’和’*’。再给定字符串B,其中可以含有’.’或’*’,’*’字符不能是B的首字符,并且任意两个’*’字符不相邻。exp中的’.’代表任何一个字符,B中的’*’表示’*’的前一个字符可以有0个或者多个。请写一个函数,判断A是否能被B匹配。

给定两个字符串AB,同时给定两个串的长度lenalenb,请返回一个bool值代表能否匹配。保证两串的长度均小于等于300。

测试样例:
"abcd",4,".*",2
返回:true
#include<iostream>#include <vector>#include<string>#include <algorithm>using namespace std;bool chkWildMatch(string A, int lena, string B, int lenb) {// write code hereif (B.find(".*")<B.length()){return true;}int j = 0;for (int i = 0; i<lenb; i++){if (j >= lena){return true;}if (A[j] == B[i] || B[i] == '.'){j++;}else if (B[i] == '*'){if (A[j] == B[i - 1]){j++;i--;}else if (A[j] == B[i + 1]){j++;i++;}}}if (j >= lena){return true;}elsereturn false;}int main(){string s1 = "abcd";string s2 = ".*b";if (chkWildMatch(s1, 4, s2, 2))cout << "yes";else cout << "no";return 0;}



0 0
原创粉丝点击