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])
【不能思维定式,当找到某种关系不行时应该寻求更好的关系式】