1、汽水瓶
//观察数据,取巧法
int CalcNuMber_1(int n)
{
return n / 2;
}
//概念法
int CalcNumber(int n)
{
int sum = 0;
while (n > 1)
{
int res = n / 3;
int left = n % 3;
sum += res;
n = left + res;
if (n == 2)
{
sum++;
break;
}
}
return sum;
}
int main()
{
int n;
while (cin >> n)
{
if (n == 0)
break;
int res = CalcNuMber_1(n);
cout << res << endl;
}
return 0;
}
2、查找两个字符串a,b中的最长公共子串(动态规划)
string GetComSubstr(string &str1, string &str2)
{
if (str1.size()>str2.size())
swap(str1, str2);
int len1 = str1.size();
int len2 = str2.size();
vector<vector<int>> MSC(len1 + 1, vector<int>(len2 + 1, 0));
int start = 0, Maxsize = 0;
for (int i = 1; i <= len1; ++i)
{
for (int j = 1; j <= len2; ++j)
{
if (str1[i - 1] == str2[j - 1])
MSC[i][j] = MSC[i - 1][j - 1] + 1;
if (MSC[i][j]>Maxsize)
{
Maxsize = MSC[i][j];
start = i - Maxsize;
}
}
}
return str1.substr(start, Maxsize);
}
int main()
{
string str1, str2;
while (cin >> str1 >> str2)
{
string substr = GetComSubstr(str1, str2);
cout << substr << endl;
}
return 0;
}
3、字符串反转(双指针)
void StrReverse(string &str)
{
int start = 0;
int end = str.size() - 1;
while (start<end)
{
int tmp = str[start];
str[start] = str[end];
str[end] = tmp;
start++;
end--;
}
}
int main()
{
string str;
while (getline(cin, str))
{
StrReverse(str);
cout << str << endl;
}
return 0;
}
4、公共子串计算(DP)
int GetMaxComSubstr(string str1, string str2)
{
int Max_len;
int len1 = str1.size();
int len2 = str2.size();
int max_len = 0;
vector<vector<int>> MAC(len1 + 1, vector<int>(len2 + 1, 0));
for (int i = 1; i <= len1; ++i)
{
for (int j = 1; j<=len2; ++j)
{
if (str1[i - 1] == str2[j - 1])
MAC[i][j] = MAC[i - 1][j - 1] + 1;
if (max_len<MAC[i][j])
{
max_len = MAC[i][j];
}
}
}
return max_len;
}
int main()
{
string str1, str2;
while (cin >> str1 >> str2)
{
int Max_len = GetMaxComSubstr(str1, str2);
cout << Max_len << endl;
}
return 0;
}