10.12考试总结
硬币找零
真·水题。连我都会做的DP......实际上就是背包问题,一个物品可以被用无数次,然后找要求的最小值,找不到找最近的数据
所以直接找啊
for (int i=1; i<=n; ++i)
for (int j=a[i]; j<=t; ++j)
f[j] = min(f[j], f[j-a[i]]+1);
就是不断枚举当前硬币面值得大小,一直找组成当前面子j的最小方案
物品装箱问题
照样是一个比较简单的背包问题当然我要是没有做对就不会说这种话来,想到了转移方程就超级简单系列所以说01背包转移方程看起来我是没有做过难题
for (int i=1; i<=n; ++i)
for (int j=tot; j>=0; --j)
{
if (aw[i] <= j)
f[j] = max(f[j], f[j-aw[i]] + av[i]);
if (bw[i] <= j)
f[j] = max(f[j], f[j-bw[i]] + bv[i]);
}
因为是两种方案,所以都要考虑一边,找最大值
编辑距离
这个题目就选学起来了,考试的时候想不到怎么用数组模拟替换,删除的过程.......
实际上暴力更改就好了
如果一样就直接继承上一次的\[f[i][j]=f[i-1][j]+1\] 如果不一样就模拟删除,替换的操作就可以了
for (int i=1; i<=lena; ++i)
for (int j=1; j<=lenb; ++j)
{
if (a[i-1] == b[j-1]) f[i][j] = f[i-1][j-1];
else f[i][j] = min(f[i-1][j-1], min(f[i-1][j], f[i][j-1])) + 1;
}
模拟完了,但是要注意边界问题。就是所谓的极限情况
关键子工程
拓扑排序.....最后还是学了这个东西。才发现好简单
但是机房停电.......代码丢没了,脾气突然暴躁起来
本身就是一个裸的拓扑所以掌握了拓扑就还好了.....