//
// 2.cpp
// leecode
//
// Created by 陆炫宇 on 17/6/16.
// Copyright © 2017年 陆炫宇. All rights reserved.
// 额 暂时做到能执行就好了 累了累了
// 6. 数组最大值 不能取相邻 第一反应是动态规划问题 那么就有一个动态规划的数组来做 根矩阵连乘有点儿类似 但是忘记了 规划方程: f=max(fn-2*f(n),f(n-1));(1)WA 原来是最大和啊 看错了
// 7. 咦 这个不是 编辑距离么 当时学的时候就觉得挺难的 现在也忘了... 不过知道 动态规划来做就好 我记得有3种情况来着 这个情况要复杂一些
// 这样说吧 分别两个方向矩阵来存储
#include <iostream>
#include <vector>
using namespace std;
class Solution {
public:
int dis[1001][1001];
int min(int a,int b,int c)
{
b=b<c?b:c;
return a<b?a:b;
}
int minDistance(string w1, string w2) {
int l1=w1.length();
int l2=w2.length();
//initial: 由l1-》l2 三中操作 插入 删除 替换 起点: l1的所有 变换到l2的第一位 然后逐渐上shen到l2的全部
//so: l2*l1矩阵
int i,j;
for(i=0;i<l1+1;i++){
dis[0][i]=i;
}
for(i=0;i<l2+1;i++){
dis[i][0]=i;
}
//algor for every : new j++,we have : 1 [i][j]=[i-1][j]+1 插入一个相同的字母 2 [i+1][j]+1 对不起 想不清楚
//from s j 到 t i 过程中: (1)sj-1 ->ti-1 比较一下 s[j-1]==t[i-1] or +1;(2)s[j]->t[i-1] 则 插入t[i-1]+1 (3)s[j-1]->t[i] dels[j-1] +1
for(i=1;i<l2+1;i++){
for(j=1;j<l1+1;j++){
int eq=1;
if(w1[j-1]==w2[i-1])
eq=0;
dis[i][j]=min(eq+dis[i-1][j-1],dis[i-1][j]+1,dis[i][j-1]+1);
// cout<<dis[i][j]<<" ";
}
// cout<<endl;
}
return dis[l2][l1];
}
int maxSum(vector<int>& A) {
int n=A.size();
if(n==1)
return A[0];
int i,j;
int sum=1;
int* max=new int[n];
max[0]=A[0];
max[1]=A[0]>A[1]?A[0]:A[1];
for(i=2;i<n;i++){
max[i]=(max[i-2]+A[i])>max[i-1]?(max[i-2]+A[i]):max[i-1];
}
return max[n-1];
}
};
int main(){
string a,b;
a="cafe";
b="a";
Solution s;
cout<< s.minDistance(a, b);
}
//int main(){
// vector<int> A;
// A.push_back(2);
// A.push_back(3);
// A.push_back(3);
// A.push_back(3);
// A.push_back(1);
// A.push_back(3);
// A.push_back(3);
// Solution S;
// cout<< S.maxSum(A)<<endl;
//
// return 0;
//}
// 2.cpp
// leecode
//
// Created by 陆炫宇 on 17/6/16.
// Copyright © 2017年 陆炫宇. All rights reserved.
// 额 暂时做到能执行就好了 累了累了
// 6. 数组最大值 不能取相邻 第一反应是动态规划问题 那么就有一个动态规划的数组来做 根矩阵连乘有点儿类似 但是忘记了 规划方程: f=max(fn-2*f(n),f(n-1));(1)WA 原来是最大和啊 看错了
// 7. 咦 这个不是 编辑距离么 当时学的时候就觉得挺难的 现在也忘了... 不过知道 动态规划来做就好 我记得有3种情况来着 这个情况要复杂一些
// 这样说吧 分别两个方向矩阵来存储
#include <iostream>
#include <vector>
using namespace std;
class Solution {
public:
int dis[1001][1001];
int min(int a,int b,int c)
{
b=b<c?b:c;
return a<b?a:b;
}
int minDistance(string w1, string w2) {
int l1=w1.length();
int l2=w2.length();
//initial: 由l1-》l2 三中操作 插入 删除 替换 起点: l1的所有 变换到l2的第一位 然后逐渐上shen到l2的全部
//so: l2*l1矩阵
int i,j;
for(i=0;i<l1+1;i++){
dis[0][i]=i;
}
for(i=0;i<l2+1;i++){
dis[i][0]=i;
}
//algor for every : new j++,we have : 1 [i][j]=[i-1][j]+1 插入一个相同的字母 2 [i+1][j]+1 对不起 想不清楚
//from s j 到 t i 过程中: (1)sj-1 ->ti-1 比较一下 s[j-1]==t[i-1] or +1;(2)s[j]->t[i-1] 则 插入t[i-1]+1 (3)s[j-1]->t[i] dels[j-1] +1
for(i=1;i<l2+1;i++){
for(j=1;j<l1+1;j++){
int eq=1;
if(w1[j-1]==w2[i-1])
eq=0;
dis[i][j]=min(eq+dis[i-1][j-1],dis[i-1][j]+1,dis[i][j-1]+1);
// cout<<dis[i][j]<<" ";
}
// cout<<endl;
}
return dis[l2][l1];
}
int maxSum(vector<int>& A) {
int n=A.size();
if(n==1)
return A[0];
int i,j;
int sum=1;
int* max=new int[n];
max[0]=A[0];
max[1]=A[0]>A[1]?A[0]:A[1];
for(i=2;i<n;i++){
max[i]=(max[i-2]+A[i])>max[i-1]?(max[i-2]+A[i]):max[i-1];
}
return max[n-1];
}
};
int main(){
string a,b;
a="cafe";
b="a";
Solution s;
cout<< s.minDistance(a, b);
}
//int main(){
// vector<int> A;
// A.push_back(2);
// A.push_back(3);
// A.push_back(3);
// A.push_back(3);
// A.push_back(1);
// A.push_back(3);
// A.push_back(3);
// Solution S;
// cout<< S.maxSum(A)<<endl;
//
// return 0;
//}