這道題一部分是求最長遞減子串行,但是由於要求不重複的最長子序列的個數,所以難度要大些。
我這裡用的是用乙個set過濾重複。算是比較笨的方法,不過也好理解些。比較聰明的方法見這裡:
另外,這道題我用c++提交是wa,但是用g++提交ac。由於discuss上面有測試資料,所以基本肯定是編譯器的差異。我也是第一次遇到c++不過而g++能過的。
thestoryofsnow
1952
accepted
708k
141ms
g++1734b
/*
id: thestor1
lang: c++
task: poj1952
*/#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std;
const int maxn = 5000;
int main()
for (int i = 0; i < n; ++i)
}} for (int i = 0; i < n; ++i)
setprevs;
// start from behind to front,
// because if the front and behind is the same prices,
// whatever in the front is contained in the behind(count)
// the opposite is not true
for (int j = i - 1; j >= 0; --j)
}} int maxlen = 1;
for (int i = 0; i < n; ++i)
}int total = 0;
setends;
// similiar to the above comment, we need to add counts from behind to front
// to add all the necessary counts but no overlap
for (int i = n - 1; i >= 0; --i)
}printf("%d %d\n", maxlen, total);
} return 0;
}
POJ 1952 最長下降子串行 方案數
求最長下降子串行 簡單 就是求方案數比較麻煩點 看了別人的解題報考才懂 也對最長 子串行的理解更深一步 include include includeusing namespace std const int maxn 5005 int n int price maxn len maxn count...
POJ 1952(最長不下降子串行的個數)
求乙個序列的最長不下降子串行的長度,與個數 相同數列算1個 關鍵是如何判重。顯然如果之前有乙個尾數相同且長度相同的序列,哪麼後乙個包含前乙個所有可能的序列相同的序列,故將前乙個序列刪除 重複 program p1952 var n,i,j,ans longint a,len,f,path array...
POJ 1952(最長不下降子串行的個數)
求乙個序列的最長不下降子串行的長度,與個數 相同數列算1個 關鍵是如何判重。顯然如果之前有乙個尾數相同且長度相同的序列,哪麼後乙個包含前乙個所有可能的序列相同的序列,故將前乙個序列刪除 重複 program p1952 var n,i,j,ans longint a,len,f,path array...