回覆列表
-
1 # 使用者8000918501991
-
2 # 使用者1465424935672
二維動規是如果只用到本層的和上一層的資料就可以用滾動陣列
比如 dp[i,j]=max(dp[i-1,j],dp[i,j-1]);
max的意思就不多說了...
具體例子的話,比較經典的就是最長公共子序列,就是 abcde 和 aecd的最長公共子序列就是acd。
如果不是滾動陣列的話就是
for i:=1 to length(st1) do
for j:=1 to length(st2)do
if st1[i]=st2[j] then dp[i,j]:=dp[i-1,j-1]+1
else dp[i,j]:=max(dp[i-1,j],dp[i,j-1]);
for i:=1 to length(st1) do
for j:=1 to length(st2)do
if odd(i) then
begin
if st1[i]=st1[j] then dp[1,j]:=dp[2,j-1]+1
else dp[1,j]:=max(dp[2,j],dp[1,j-1]);
end
else
begin
if st1[i]=st2[j] then dp[2,j]:=dp[1,j-1]+1
else dp[2,j]:=max(dp[1,j],dp[2,j-1]);
end;
a型別是屬於type *(type是你事先給a定義的型別)的,即type型指標。所以a的值是一個記憶體地址。若a是一維陣列,則a指向的是第一個元素。若a是二維陣列,也可以將a看成一個一維陣列,那麼其元素是其行向量。例如{{2,2},{3,4}}。既然a又看成一維陣列,那麼*a即是其第一個“元素”——其第一行。而第一行亦是一個數組,所以*a是第一行這個陣列的指標。那麼,**a即第一行的第一個元素a[0][0],而*(*a+1)則是第一行的第二個元素a[0][1]。下面的例子中,說明a與*a的值相同,但是需要注意的是地址相同,也並不意味著他們的指向的地方相同。事實不仿試一下a+1與*a+1,會發現二者並不相等。正是因為其意義不同。正是其意義的不同,所以可以透過地址運算,表示出相應位置的元素,比如說*(*(a+1)+1),表示的就是a[1][1]。若a是高維的,其本質還是陣列的巢狀,所以根據上面的方法易得出。下面這個例子正是一個很好的說明吧。(其實我是看到這裡才明白是怎麼回事的。)