給你個
n ,然後
n個數,你要找到乙個最長的序列
s ,輸出其長度,並且輸出不同的
s的個數。
s 序列必須是回文的,並且中間最小,往兩邊依次增大,可以相等。s1
與s2 不同當且僅當長度不同或者存在某位s1
[i]!
=s2[
i]這個dp比較難。
n範圍比較小,先把
a 陣列離散化。方便之後處理。再預處理兩個陣列pr
e[i]
[j]n
xt[i
][j]
分別表示以
i 起左邊第乙個等於j的數的位置和以
i起右邊第乙個等於j的數的位置。設d
p[l]
[r] 元組表示a[
l]==a
[r] 的時候的最長s串和最長串個數。那麼有dp
[l][
r]=m
ax列舉c再列舉區間的複雜度是n3
顯然超時。
如果固定
l ,逐漸向右掃的時候,dp
值肯定是越來越優的。我們設乙個臨時變數an
s 來表示
l 右邊開始某位置的最優值,然後往右掃的同時就可以直接用此臨時變數更新我們的dp
[l][
r],當然,也需要把an
s 的值也更新。當遇到相同值的時候,要加上數量,然後就是去重
每次更新an
s 的時候,如果發現當前串的長度等於an
s 那麼需要把個數加進an
s 但是如果之前加過一樣的長度,並且二者首尾一樣,那麼說明後者包含了更多的re
s (因為範圍更大)那麼減去原來的,加上後來的,剛好不重不漏。
//
// created by running photon
//#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define all(x) x.begin(), x.end()
#define ins(x) inserter(x, x,begin())
#define ll long long
#define clr(x) memset(x, 0, sizeof x)
using
namespace
std;
const
int inf = 0x3f3f3f3f;
const
int mod = 1e9 + 7;
const
int maxn = 1e6 + 10;
const
int maxv = 5e3 + 10;
const
double eps = 1e-9;
int a[maxv];
int pre[maxv][maxv], nxt[maxv][maxv];
typedef pair sta;
sta dp[maxv][maxv];
int main()
sort(all(xs));
xs.resize(unique(all(xs)) - xs.begin());
for(int i = 1; i <= n; i++)
// for(int i = 1; i <= n; i++)
// puts("");
memset(pre, -1, sizeof pre);
memset(nxt, -1, sizeof nxt);
int big = xs.size();
for(int i = 0; i <= n + 1; i++)
}for(int j = i - 1; j > 0; j--) }}
for(int i = n; i > 0; i--)
if(a[i] >= a[j])
else
if(dp[head][j].first == ans.first) }}
}sta ans(0, 0);
for(int c = 1; c <= big; c++)
else
if(ans.first == dp[head][tail].first)
}printf("%d %d\n", ans.first, ans.second);
}
return
0;}
hdu多校第三場
題意是將給出的數相加計算出 其中p 的倍數的最大個數。由題意可得,在任意兩個數相加時,其模值必在0 p 1之間,將兩數相加的模值替換掉之前的兩個數字,得到長度減一的效果,用0和1 標記對應模值是否出現,從而代表被處理過的但還沒有達到 p 的倍數的值,直到某次得到的模值為 0 時,再清空之前的標記 代...
2014多校聯合 第三場
1002 redraw beautiful drawings 最大流。用sap gap優化的模版過的。1.源點 每一行對應的點,流量限制為該行的和 2.每一行對應的點 每一列對應的點,流量限制為k 3.每一列對應的點 匯點,流量限制為該列的和 跑一遍最大流。如果流量小於總權值和,那麼說明imposs...
2013第三場多校
第三場多校 至今最慘的一場多校。共作出兩題。1008 狀態壓縮優化的搜尋 0 比賽時候直接狀態壓縮dp,結果tle了。沒有算好時間複雜度,第一次交的時候沒有測大資料。應該多想幾種方法,做到一a才行,不然卡題會卡很久。1 後來直接搜尋,從最後乙個狀態開始搜,每次都用乙個回文串,然後搜另乙個的最小步數。...