這道題我之前的想法是搜尋,但是超時了。。。看到大神的解題報告: 才意識到這是個dp的問題。把這個問題轉化成從乙個點出發到目的地的兩條不重疊的路徑這點比較好想(在知道之前二維撿蘋果題之後),至少也很容易理解。dp的解法為什麼不會產生正確,即為什麼兩條路徑不會有重複(除了初始和結尾點)不是很好理解。我也只能是從這道題能夠pass反推這一點。嚴謹一點的證明是:首先,初始時是滿足的;其次,每次對新的i,j對,我們只考慮j之前的k,這裡假定舊有的i,k對不含重複點(除了初始點),那麼新的i,j對也只增加一條從k到j的路徑(或者說只增加了乙個新的不可能重複的城市j),那麼i,j對也不含重複城市(除了初始點)。上述兩點可以保證最終的結果都不會含有重複點(除了初始和結尾點)。但這個想法正著想還是太難想到了。
/* id: thestor1
lang: c++
task: tour
*/#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std;
int main()
// vector> toeast(v, vector());
// vector> towest(v, vector());
std::vector> adj(v, std::vector(v, false));
for (int i = 0; i < n; ++i)
// for (int i = 0; i < toeast.size(); ++i)
// // for (int i = 0; i < toeast.size(); ++i)
// }
}cnt[j][i] = cnt[i][j];
} }int ans = 1;
for (int i = 0; i < v; ++i) }
fout<
USACO Hamming Codes 解題報告
資料小,暴力搜尋可以搞定。但是推薦使用dfs,每個節點 數 有取與不取兩個分支。注意 0是必須出現的。證明如下 最終得到的結果序列中,0是必須出現的,證明如下 如果存在另乙個滿足要求的結果序列s 其最小值為a1 n 0,那麼序列s s n 是滿足條件的最小解,且首元素為0 id xpli1 prog...
USACO Closed Fences 解題報告
幾何題看著就很有畏懼感。這裡用的是最 的演算法,時間複雜度應該在n 2。還沒看別人的解題報告,不過我猜nlogn的解法是有的。比如判斷乙個fence是不是valid的時候,這裡將所有的線段兩兩比較,看是否相交。但是有個叫line sweep的演算法,可以在nlogn的時間複雜度內完成。既然accep...
Wiggle Subsequence解題報告
這道題和最長子序列,divisible subset題目類似,都可以用o n2 的時間複雜度完成。可以想象,對於第i個數,dp i dp j 1,當且僅當dp j 1 dp i 而且nums j 和nums i 的差值和j所處位置的差值符號相反。所以,如下 class solution if dp ...