1.MT8 奇数位丢弃
1.1 解析
1.2 代码
#include <iostream>
using namespace std;
int main()
{
int n=0;
while(cin>>n)
{
int ret=1;
while(ret-1<=n)ret*=2;
cout<<(ret/2-1)<<endl;
}
return 0;
}
2.求和
求和
dfs、搜索、递归
2.1 解析
2.2 代码
#include <iostream>
using namespace std;
int n,m;
bool vis[11];
int sum;//路径和
void dfs(int x)
{
if(sum==m)//满足条件
{
for(int i=0;i<=n;i++)
{
if(vis[i])cout<<i<<' ';
}
cout<<endl;
return;
}
if(sum>m||x>n)return;//剪枝
//选
sum+=x;
vis[x]=true;
dfs(x+1);
sum-=x;//恢复现场
vis[x]=false;
//不选
dfs(x+1);
}
int main()
{
cin>>n>>m;
dfs(1);
}
3.HJ52 计算字符串的编辑距离
HJ52 计算字符串的编辑距离
动态规划
3.1 解析
3.2 代码
#include <iostream>
using namespace std;
#include <vector>
#include <string>
int main()
{
string a,b;
cin>>a>>b;
int n=a.size(),m=b.size();
//创建dp表
vector<vector<int>> dp(n+1,vector<int>(m+1));
//初始化
for(int j=1;j<=m;j++)dp[0][j]=j;
for(int i=1;i<=n;i++)dp[i][0]=i;
//填表
int ret=1e9;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(a[i-1]==b[j-1])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;
}
}
cout<<dp[n][m]<<endl;
return 0;
}