注意每次迴圈中對d陣列的初始化,不需要呼叫
memeset(d,-1,sizeof(d));
因為d陣列申請了maxl=5000+10的空間大小,這個語句在實際執行會很耗時間。而且也並不是d陣列所有的空間都需要初始化。只初始化會用到的值足矣。
#include
#include
#include
#include
using
namespace
std;
#define maxn 26+10
#define maxl 5000+10
#define inf 100000000
int l1=0,l2=0;
int sta_1[maxn];
int end_1[maxn];
int sta_2[maxn];
int end_2[maxn];
char s1[maxl],s2[maxl];
int d[maxl][maxl];
int arr[30];
int com[maxl][maxl];
bool judge(int i,int j,int x)//包括i j及 i j右邊的元素都沒有訪問過的情況下,x是否應該導致m加一
return
false;
}void com_plus()//包括i j及 i j右邊的元素都沒有訪問過
for(int k=1;kint x=s2[k]-64;
if(arr[x]==0&&judge(i,j,x))
m++;
}com[i][j]=m;}}
}int fun(int i,int j)//i j還沒入佇列
if(j<=l2)
temp=min(temp1,temp2);
d[i][j]=temp;
return d[i][j];
}int main()
scanf("%c",&c);
while(c!='\n')
for(int i=1;i<=l1+1;i++)
for(int j=1;j<=l2+1;j++)
d[i][j]=-1;
com_plus();
cout
<1,1)<}
}
uva1625 顏色的長度
兩個佇列的類似最長公共子串行問題常定義狀態為,分別移動了多少個元素。複雜代價預處理,然後狀態轉換時直接呼叫。滾動陣列可以利用多層來表示相鄰層次關係,利用t 1 來進行0和1的狀態轉換。include include include using namespace std const int maxn...
Uva 1625,顏色的長度
類似於lcs的動態規劃,指標函式的分解。題目大意 兩個顏色序列,將他們合併,合併的時候,每次都從開頭拿顏色,對於每乙個顏色 c來說,都有他的跨度 l c 就是最後的位置與最前的位置的差值,就怎樣的排列是的所有 l c 總和最小。分析 從兩個串中隨機拿字元,解答樹是特別大的。d i,j p拿前 i 個...
UVa1625 顏色長度(DP)
思路 紫書上寫的很詳細了 不是等到乙個顏色全部移完之後再相加,而是每次都計算已經開始但還沒結束的顏色的個數並將長度累加。所以,用res i j 表示第乙個串還剩i個,第二個串還剩j個,已經開始但還沒結束的字元個數。dp i j 表示第乙個還剩i個,第二個串還剩j個,還需要的最小指標函式。和書上不同 ...