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])     

【不能思维定式,当找到某种关系不行时应该寻求更好的关系式】

原创粉丝点击