动态规划一些实现

希望大家多多指正谢谢了。

装配线问题:

void fastestway(int* c12, int* c21, int* c1, int* c2, int size)
{
int f1[5], f2[5];
int r1[5], r2[5];
f1[0] = c21[0] + c1[0];
f2[0] = c12[0] + c2[0];
for(int j = 1; j < size; ++j)
{
if((f1[j - 1] + c1[j]) < (f2[j - 1] + c1[j] + c21[j])) 
{
f1[j] = f1[j - 1] + c1[j];
r1[j - 1] = 1; 
}
else 
{
f1[j] = f2[j - 1] + c1[j] + c21[j];
r1[j - 1] = 2;
}
if((f2[j - 1] + c2[j]) < (f1[j - 1] + c2[j] + c12[j]))
{
f2[j] = f2[j - 1] + c2[j];
r2[j - 1] = 2;
}
else 
{
f2[j] = f1[j - 1] + c2[j] + c12[j];
r2[j - 1] = 1;
}
}
int k;
if((f1[size - 1] + c12[size]) < (f2[size - 1] + c21[size]))
{
r1[size - 1] = 1;
printf("cost: %d\n", (f1[size - 1] + c12[size]));
for( k = 0; k < 4; ++k)
printf("%d -> ", r1[k]);
printf("%d\n", r1[size - 1]);
}
else 
{
r2[4] = 2;
printf("cost: %d\n", (f2[size - 1] + c21[size]));
for(  k = 0; k < 4; ++k)
printf("%d -> ", r2[k]);
printf("%d\n", r2[size - 1]);
}
}

最长公共子串:

pair<int, int> maxp(int up, int left, int upleft)
{
pair<int, int> res;
if(up > left)
{
if(up > upleft)
{
res.first = up;
res.second = 0;
}
else 
{
res.first = upleft;
res.second = 2;
}
}
else 
{
if(left > upleft) 
{
res.first = left;
res.second = 1;
}
else 
{
res.first = upleft;
res.second = 2;
}
}
return res;
}


void LCS(const string str1, const string str2)
{
int len1 = str1.size();
int len2 = str2.size();

pair<int, int> **a = new pair<int, int>* [len1+1];
int i,j;
for(i = 0; i < len1+1; ++i)
a[i] = new pair<int, int>[len2+1];
for(i = 0; i < len1+1; ++i)
{
for(j = 0; j < len2+1; ++j)
{
a[i][j].first= 0;
a[i][j].second = -1;
}
}


for(i = 1; i <= len1; ++i)
{
for(j = 1; j <= len2; ++j)
{
if(str1.at(i-1) == str2.at(j-1))
{
a[i][j] = maxp(a[i-1][j].first, a[i][j-1].first, a[i-1][j-1].first) ;
a[i][j].first += 1;
}
else
{
if(a[i-1][j].first > a[i][j-1].first)
{
a[i][j].first = a[i-1][j].first;
a[i][j].second = 0;
}
else 
{
a[i][j].first = a[i][j-1].first;
a[i][j].second = 1;
}
}
}
}
//回溯找到最长公共子串
i = len1;
j = len2;
stack<int> s;
while(!(i == 0 && j == 0))
{
if(a[i][j].second == 2)
{
if(a[i][j].first == a[i-1][j-1].first +1)
s.push(i);
--i;
--j;
}
else if(a[i][j].second == 0)--i;
else if(a[i][j].second == 1)--j;
}



while(!s.empty())
{
printf("%c ", str1.at(s.top()-1));
s.pop();
}

for(i = 0; i < len2; ++i)
delete[] a[i];
delete[] a;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值