輸出整體輪廓線
返回最長子陣列長度
求陣列中奇數和偶數個數相同的最長子陣列
給定乙個n行3列二維陣列, 每一行表示有一座大樓, 一共有n座大樓。 所有大樓的底部都坐落在x軸上, 每一行的三個值(a,b,c)代表每座大樓的從(a,0)點開始, 到 (b,0)點結束, 高度為c。 輸入的資料可以保證a例子: 給定乙個二維陣列 [ [1, 3, 3], [2, 4, 4], [5, 6,1] ]
輸出為輪廓線 [ [1, 2, 3], [2, 4, 4], [5, 6, 1] ]
public
static
class
node
}public
static
class
nodecomparator
implements
comparator
if(o1.isup != o2.isup)
return0;
}}public
static list
>
buildingoutline
(int
buildings)
arrays.
sort
(nodes,
newnodecomparator()
);treemap
htmap =
newtreemap
<
>()
; treemap
pmmap =
newtreemap
<
>()
;for
(int i =
0; i < nodes.length; i++
)else
}else
else}}
if(htmap.
isempty()
)else
} list
> res =
newarraylist
<
>()
;int start =0;
int height =0;
for(entry
entry : pmmap.
entryset()
) start = curposition;
height = curmaxheight;}}
return res;
}
題目描述:給定乙個陣列arr, 和乙個整數num, 求在arr中, 累加和等於num的最長子陣列的長度
例子:arr = num = 7
其中有很多的子陣列累加和等於7, 但是最長的子陣列是, 所以返回其長度4
題解:建立乙個hashmap,key儲存從0位置開始到每個位置的長度,value 儲存出現長度的位置。如果sum-aim的結果出現在map中,則說明有這個長度,獲取長度即可。如果沒有出現過,儲存在 map 中即可。
public
static
intmaxlength
(int
arr,
int aim)
hashmap
map =
newhashmap
(); map.
put(0,
-1);
// important
int len =0;
int sum =0;
for(
int i =
0; i < arr.length; i++)if
(!map.
containskey
(sum))}
return len;
}
用動態劃分思想,最後乙個位置的數肯定會被劃分,那麼就有兩種可能
最後乙個數所在部分不是異或和為 0 的子陣列,那麼 dp[i] = dp[i-1]
最後乙個數所在部分是異或和為 0 的子陣列,那麼 dp[i] = dp[k-1] +1
public
static
intmosteor
(int
arr)
if(i >0)
map.
put(xor, i)
; ans = math.
max(ans, dp[i]);
}return ans;
}
大樓輪廓線
輸入第一行乙個數表示有n座大樓,後面依次輸入n行,每一行表示大樓的起始點,終點和高度,輸出為大樓輪廓資訊 如下圖 第一行輸出為3 後面有三行輸入表示大樓的資訊 第二行為 1 3 3 第三行為 2 4 4 第三行為 5 6 1 輸出大樓輪廓資訊 第一行 1 2 3 第二行 2 4 4 第三行 5 6 ...
輪廓線動態規劃
這類問題的共同特點是 在乙個比較 窄 的棋盤上進行複雜操作。如果採用傳統方法 以整行整列為狀態 進行動態規劃,將無法進行狀態轉移,因此只能把參差不齊的 輪廓線 作為狀態的一部分。儘管輪廓線的形態複雜,但由於棋盤比較窄,狀態總數仍然可以控制在可以接受的範圍內。直接看例題 1,鋪放骨牌 用1 2骨牌覆蓋...
輪廓線DP 專項
題意 n m n mn m n,m 11 的矩陣,填1 2 1 21 2或2 12 1 2 1方塊,求方案數 解析 以前寫過狀壓的做法,直接一行一行維護,現在寫輪廓線的做法 注意 當前填紅點的意思是,以紅點作為方塊的右下角 因為方塊長度為2,所以對紅點位置有三種操作 向上填 為了使所有方塊填滿,如果...