1 编辑距离 1207 √
https://www.luogu.com.cn/problem/P2758
- 字符的输入是覆盖不是追加,在输入前追加空格会被cin吃掉。所以应该在输入后a=" "+a;
- len需要-1,因为多了一个空格
- i=1到i<=len
- 注意还有相等的时候的判断
dp[i][j] = min(dp[i - 1][j], min(dp[i][j - 1], dp[i - 1][j - 1])) + 1;
//为啥插入是i j-1:因为我们凭空变出来一个与j匹配。那a的前i个还没匹配
//所以应该是前i个到j
点击查看代码
#include<bits/stdc++.h>
using namespace std;
string a = "";
string b = "";
const int maxn = 2010;
int dp[maxn][maxn];
int main()
{
cin >> a >> b;
//字符的输入是覆盖不是追加,在输入前追加空格会被cin吃掉。
a = " "+a;
b = " "+b;
int alen = a.length() - 1;
int blen = b.length() - 1;
for (int i = 1;i <= alen;i++)dp[i][0] = i;
for (int i = 1;i <= blen;i++)dp[0][i] = i;
for (int i = 1;i <= alen;i++)
{
for (int j = 1;j <= blen;j++)
{
if (a[i] == b[j])
dp[i][j] = dp[i - 1][j - 1];
else
dp[i][j] = min(dp[i - 1][j], min(dp[i][j - 1], dp[i - 1][j - 1])) + 1;
//为啥插入是i j-1:因为我们凭空变出来一个与j匹配。那a的前i个还没匹配
//所以应该是前i个到j
}
}
cout << dp[alen][blen] << endl;
}
2 捡水果/石子合并 1207√
https://www.luogu.com.cn/problem/P1090
点击查看代码
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e4 + 10;;
int n;
int a[maxn];
int ans = 0;
int main()
{
cin >> n;
priority_queue<int, vector<int>, greater<int>> q;
for (int i = 0;i < n;i++)
{
cin >> a[i];
q.push(a[i]);
}
while (q.size() > 1)
{
int a = q.top();
q.pop();
int b = q.top();
q.pop();
ans += a + b;
int s = a + b;
q.push(s);
}
cout << ans << endl;
}
3 01背包
4 数字三角形 1207 √
https://oj.sdutacm.cn/onlinejudge3/contests/4286/problems/C
- 是从倒数第二行开始合并的,注意我们相当于在覆盖。
- 注意边界
for (int i = n-1;i >0;i--)
{
for (int j = 1;j <= i;j++)
点击查看代码
#include<bits/stdc++.h>
using namespace std;
const int maxn = 110;
int dp[maxn][maxn];
int main()
{
int n;
cin >> n;
for (int i = 1;i <= n;i++)
{
for (int j = 1;j <= i;j++)
cin >> dp[i][j];
}
for (int i = n-1;i >0;i--)
{
for (int j = 1;j <= i;j++)
{
dp[i][j]+= max(dp[i + 1][j], dp[i + 1][j + 1]);
}
}
cout << dp[1][1] << endl;
}
浙公网安备 33010602011771号