第七题:
主要格式控制
代码
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int a, b;
char c;
int main()
{
scanf("%c%d%c", &c, &a, &c);
getchar();
scanf("%c%d%c", &c, &b, &c);
printf("%c%d%c", c, a + b, c);
return 0;
}
第八题
思路:
枚举所有的情况,如果当前这个序列是回文,就ans++, 最后输出ans
代码
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
string x, s;
int main()
{
int ans = 0;
cin >> s;
for(int i = 0; i < s.size(); i++)
{
x = "";
for(int j = 0; j <= i; j++)
{
x += s[i - j];///思考一下为什么不能从0开始
string t = x;
reverse(t.begin(), t.end());
if(t == x)
{
// cout << x << endl;
ans++;
}
}
}
cout <<ans << endl;
return 0;
}
第九题
思路
区间DP石子合并经典问题, 见蓝皮书284页
#include <iostream>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
int n;
int a[110], sum[110];
int f[110][110];
int main()
{
cin >>n;
memset(f, 0x3f, sizeof f);
for(int i = 1; i <= n; i++)
{
cin >> a[i];
sum[i] = sum[i - 1] + a[i];
f[i][i] = 0;
}
for(int len = 2; len <= n; len++)//区间长度
{
for(int l = 1; l <= n - len + 1; l++)
{
int r = l + len - 1;
int s = sum[r] - sum[l - 1];
for(int k = l; k < r; k++)
{
f[l][r] = min(f[l][r], f[l][k] + f[k + 1][r] + s);
}
}
}
cout << f[1][n] << endl;
return 0;
}
第十题:
暴力枚举
代码
#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std;
string s[110];
int n;
string get_ans(string t, int k)
{
string ans = t.substr(0, 1);
for(int i = 0; i < n; i++)
{
if(i == k) continue;
int j = 0;
while(s[i][j] == t[j])
{
j++;
if(j >= ans.size())
{
ans = t.substr(0, j + 1);
//cout <<ans << endl;
}
}
}
return ans;
}
int main()
{
/*string f = "abcde";
f = f.substr(0, 2);
cout << f << endl;*/
cin >> n;
for(int i = 0; i < n; i++)
cin >> s[i];
for(int i = 0; i < n; i++)
{
string ans = get_ans(s[i], i);
cout << ans << endl;
}
return 0;
}
字符串HASH代码 不能全过
#include <iostream>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
typedef unsigned long long ULL;
const int N = 110, P = 13331;
ULL p[N][N], h[N][N];
int n, m;
char s[N][N];
ULL query(int l, int r, int i)
{
return h[i][r] - h[i][l - 1] * p[i][r - l + 1];
}
int main()
{
scanf("%d", &n);
for(int i = 1; i <= n; i++)
{
scanf("%s", s[i] + 1);
//cout << s[i] + 1<< endl;
}
for(int k = 1; k <= n; k++)
{
p[k][0] = 1;
int Size = strlen(s[k] + 1);
for (int i = 1; i <= Size; i++)
{
p[k][i] = p[k][i - 1] * P;
h[k][i] = h[k][i - 1] * P + s[k][i] - 'a' + 1;
}
}
for(int i = 1; i <= n; i++)
{
int len = 1;
for(int j = 1; j <= n; j++)
{
if(i == j) continue;
int Size = strlen(s[j] + 1);
for(int k = 1; k <= Size; k++)
{//cout << query(1, k, i) << " " << query(1, k, j) << endl;
if(query(1, k, i) == query(1, k, j))
{
if(k >= len)
len++;
}
else break;
}
}
for(int k = 1; k <= len; k++)
printf("%c", s[i][k]);
cout << endl;
}
}