51nod-17-10-29

#51nod 1183 编辑距离
##解题思路
开始想的用两个字符串的最大长度减去两个字符串的最长公共子串,想当然了。这就要求我们做题的时候一定要考虑全面,不放过一个细节。
再说做法,跟最长公共子串的做法相似,动态规划。
##代码

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
char str1[1010], str2[1010];
int dp[1010][1010];
int len1, len2;
int main(){
    int i, j;
    scanf("%s", str1);
    scanf("%s", str2);
    len1 = strlen(str1);
    len2 = strlen(str2);
    for(i = 1; i <= len1; ++i)
        dp[i][0] = i;
    for(i = 1; i <= len2; ++i)
        dp[0][i] = i;
    for(i = 0; i < len1; ++i){
        for(j = 0; j < len2; ++j){
            dp[i + 1][j + 1] = min(min(dp[i + 1][j], dp[i][j + 1]) + 1, dp[i][j] + !(str1[i] == str2[j]));
        }
    }
    printf("%d\n", dp[len1][len2]);
    return 0;
}

##问题

  1. 为什么那三种情况就是全部的子问题?
  2. 某个字符串增加一个字符对两个字符串编辑距离的影响?
    #51nod 1185 威佐夫游戏V2
    ##解题思路
    威佐夫游戏,判断是否是奇异局势,再对精度的问题处理一下。
    ##代码
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<algorithm>
using namespace std;
typedef unsigned long long ULL;
const double cnm = (sqrt(5) + 1) / 2;
const ULL Gold[3] = {618033988, 749894848, 204586834};
const ULL MOD = 1000000000;
int main(){
	int t;
	ULL a, b, c;
	scanf("%d", &t);
	while(t--){
		scanf("%llu%llu", &a, &b);
		if(a > b) swap(a, b);
		ULL dist = b - a;
        ULL pre = dist / MOD, las = dist % MOD;
        ULL a1 = las * Gold[2];
        ULL a2 = pre * Gold[2] + las * Gold[1] + a1 / MOD;
        ULL a3 = pre * Gold[1] + las * Gold[0] + a2 / MOD;
        ULL a4 = dist + pre * Gold[0] + a3 / MOD;	
		printf("%c\n", a4 == a ? 'B' : 'A');
	}
	return 0;
}

##问题

  1. 对精度控制的方式
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值