问题1:给定两个字符串str1和str2,输出两个字符串的最长公共子串,保证str1和str2的最长公共子串存在且唯一。
问题2:给定n个整数组成的序列,现在要求将序列分割为m段,每段子序列中的数在原序列中连续排列。如何分割才能使这m段子序列的和的最大值达到最小?
#include <iostream>
#include <string>
#include <vector>
using namespace std;
string longestCommonSubstring(const string &str1, const string &str2) {
int m = str1.size();
int n = str2.size();
vector<vector<int>> dp(m + 1, vector<int>(n + 1, 0));
int maxLength = 0;
int endIndex = 0;
for (int i = 1; i <= m; i++) {
for (int j = 1; j <= n; j++) {
if (str1[i - 1] == str2[j - 1]) {
dp[i][j] = dp[i - 1][j - 1] + 1;
if (dp[i][j] > maxLength) {
maxLength = dp[i][j];
endIndex = i;
}
}
}
}
return str1.substr(endIndex - maxLength, maxLength);
}
int main() {
string str1, str2;
cout << "输入字符串1: ";
cin >> str1;
cout << "输入字符串2: ";
cin >> str2;
string result = longestCommonSubstring(str1, str2);
cout << "最长公共字符串是: " << result << endl;
return 0;
}
#include <iostream>
#include <fstream>
#include <vector>
#include <climits>
using namespace std;
long long minMaxSum(vector<int>& nums, int m) {
int n = nums.size();
vector<vector<long long>> dp(n + 1, vector<long long>(m + 1, LLONG_MAX));
vector<long long> prefixSum(n + 1, 0);
// 计算前缀和
for (int i = 0; i < n; ++i) {
prefixSum[i + 1] = prefixSum[i] + nums[i];
}
// 初始化
for (int i = 0; i <= n; ++i) {
dp[i][1] = prefixSum[i];
}
// 动态规划
for (int i = 2; i <= n; ++i) {
for (int j = 2; j <= m; ++j) {
for (int k = 0; k < i; ++k) {
dp[i][j] = min(dp[i][j], max(dp[k][j - 1], prefixSum[i] - prefixSum[k]));
}
}
}
return dp[n][m];
}
int main() {
string inputFile = "sum0.in";
ifstream inFile(inputFile);
if (!inFile.is_open()) {
cout << "打开失败" << endl;
return 1;
}
int n, m;
inFile >> n >> m;
vector<int> nums(n);
for (int i = 0; i < n; ++i) {
inFile >> nums[i];
}
inFile.close();
// 从输入文件名中提取编号
string fileNumber = inputFile.substr(3, inputFile.find('.') - 3);
// 构造输出文件名
string outputFileName = "output" + fileNumber + ".txt";
// 打开输出文件
ofstream outFile(outputFileName);
if (!outFile.is_open()) {
cout << "无法创建输出文件" << endl;
return 1;
}
// 将结果写入输出文件
outFile << minMaxSum(nums, m) << endl;
cout<<"输出成功";
// 关闭输出文件
outFile.close();
return 0;
}