poj之动态规划
来源:互联网 发布:java线程池和队列 编辑:程序博客网 时间:2024/04/29 18:57
1050 动态规划(化二维为一维)
http://hi.baidu.com/newmyl/blog/item/c41a5f7f091dc80c29388a60.html
1080 两串字符串求最大匹配度【做过居然还不会,需要反省】
#include <cstdio>
int score[5][5]={5,-1,-2,-1,-3,-1,5,-3,-2,-4,-2,-3,5,-2,-2,-1,-2,-2,5,-1,-3,-4,-2,-1,0};
int res[101][101];
int getint(char c)
{
switch(c)
{
case 'A':
return 0;
case 'C':
return 1;
case 'G':
return 2;
case 'T':
return 3;
case '-':
return 4;
}
}
int main()
{
int t,m,n,i,j;
char a[105],b[105];
scanf("%d",&t);
while(t--)
{
scanf("%d%s",&m,&a);
scanf("%d%s",&n,&b);
res[0][0]=0;
for(i=1;i<=m;i++)
res[i][0]=res[i-1][0]+score[getint(a[i-1])][4];
for(i=1;i<=n;i++)
res[0][i]=res[0][i-1]+score[4][getint(b[i-1])];
for(i=1;i<=m;i++){
for(j=1;j<=n;j++)
{
res[i][j]=res[i-1][j-1]+score[getint(a[i-1])][getint(b[j-1])];
if(res[i-1][j]+score[getint(a[i-1])][4]>res[i][j])
res[i][j]=res[i-1][j]+score[getint(a[i-1])][4];
if(res[i][j-1]+score[4][getint(b[j-1])]>res[i][j])
res[i][j]=res[i][j-1]+score[4][getint(b[j-1])];
}
}
printf("%d\n",res[m][n]);
}
return 0;
}
1141 动态规划加回溯
#include <iostream>
#include "string.h"
using namespace std;
#define MAX 0x7fffffff
char str[120];
int list[102][102],tag[102][102];
void output(int start,int end)
{
if(start>end)return;
else if(start==end)
{
if(str[start]=='('||str[start]==')')
printf("()");
else
printf("[]");
}
else
{
if(tag[start][end]==-1)
{
printf("%c",str[start]);
output(start+1,end-1);
printf("%c",str[end]);
}
else{
output(start,tag[start][end]);
output(tag[start][end]+1,end);
}
}
}
int main()
{
int len,i,j,k;
while(cin.getline(str,120))
{
len=strlen(str);
for(i=0;i<len;i++){
list[i+1][i]=0;
list[i][i]=1;
}
for(j=1;j<len;j++)
{
for(i=0;i+j<len;i++)
{
list[i][i+j]=MAX;
if((str[i]=='('&&str[i+j]==')')||(str[i]=='['&&str[i+j]==']'))
list[i][i+j]=list[i+1][i+j-1];
tag[i][i+j]=-1;
for(k=i;k<i+j;k++)
{
if(list[i][k]+list[k+1][i+j]<list[i][i+j]){
list[i][i+j]=list[i][k]+list[k+1][i+j];
tag[i][i+j]=k;
}
}
}
}
output(0,len-1);printf("\n");
}
return 0;
}
3638 开始用一个数组[k][i][j]表示从点i到点j的有k个没有记录的点的最小花费,可是居然复杂度o(n^5),一直是超时。后来请教艾,直接用数组[i][j]表示从第0个点到第j个点的记录了i个点的最小花费。则有 [i][j]=min([i-1][k]+cost[k][j])
【不能思维定式,当找到某种关系不行时应该寻求更好的关系式】
- poj之动态规划
- poj 动态规划之1088 滑雪
- poj 动态规划之1125 Stockbroker Grapevine
- poj 2411 动态规划
- Poj 1157(动态规划)
- POJ 1651动态规划
- Poj 1221 动态规划
- POJ 3186 动态规划
- [poj]动态规划2479
- [poj]动态规划1015
- [poj] 动态规划 1141
- POJ 1088 动态规划
- poj 1636 动态规划
- poj 1159 动态规划
- POJ 动态规划 题集
- poj 1088 动态规划
- POJ 3267 动态规划
- poj 2609 动态规划
- 质数、合数快速判断
- 时间优化的算法题
- 【转】关于并查集
- [转]NIM取石子游戏
- [转]三角形几个重要的点
- poj之动态规划
- 并查集及模板
- O(nlog(n))的最长上升(不下降)子序列算法
- KMP串匹配算法
- poj一些题型思路
- 稳定婚姻问题
- matlab安装
- MFC中一些函数介绍
- 树形dp