題意:給定一個矩形塊,它裡麵包含了n個小矩形塊,現在要求將每個小矩形塊塗上給定的顏色。塗色過程中,小矩形必須是整塊整塊的塗,並且只有當某個矩形上面的所有矩形都被塗色之後它才能被塗色。假如每隻筆只能塗一種顏色,問至少需要換多少次筆。(第一次拿起筆也算一次)。題解:給小矩形塊編號,然後建圖,記錄每一個小矩形上方相鄰的矩形的編號。#include <iostream>using namespace std;#define N 16int m, n, ans;int up[N][N],
題意:給定一條原始字元序列,以及一些單詞,問至少去掉多少個字母才能使原始序列全部由單片語合而成。題解:dp [ i ] 表示在第 i 個字母之前最少要刪除的字母個數。枚舉原始序列的每一個字母,0,1,2,3····。只有刪與不刪兩種狀態。假設刪掉第 i 個字母,則 dp [ i ] = dp [ i - 1 ] + 1; 假設不刪掉第 i 個字母,那麼令 i 是某個單詞的最後一個字母,因此我們在原始序列中從 i 開始往前與每個單詞進行比較,尋找滿足條件的單詞。 找到之後, dp [ i ] =
1254 - lcsTime Limit: 3000 msMemory Limit: 65535 KbDescriptionThis problem seems a little easy. Because the two given sequences p1 p2 are just permutations of 1~n. So try it and tell me the answer what the length of longest common subsequence
題意:從一列隊伍中抽出一些人,使得剩下的隊伍中的人按身高有序排列(升序,或者降序,或者先升後降).題解:LIS。枚舉邊界。邊界左邊的人身高逐漸升高,右邊的逐漸降低。#include <cstdio>#define N 1010double array[N];int dpleft[N], dpright[N];int max ( int a, int b ){return a > b ? a : b;}int min ( int a, int b ){return a <
題意:John買了一塊矩形的地。他想在上面種草餵奶牛,但是有的格子比較貧瘠不能種草,我們用0表示。否則用1表示。由於奶牛不喜歡擠在一起,所以任何兩個相鄰格子不能都種上草。現在問你有多少種種草的方式。當然,不種草也算一種方式。題解:第 i 行的第 j 中狀態由前一行決定。故枚舉第 i - 1 行中所有與 j 相容的狀態。#include <iostream>using namespace std;#define Num 100000000#define N
題意:n個人形成一個關係樹,每個節點代表一個人,節點的父節點表示這個人的唯一上司,只有根沒有上司。要求從這n個人中選擇一部分,使得任意兩個人之間沒有直接的上下級關係,問最多可以選多少人?並且判斷最優方案是否唯一,是則Yes,否則No。題解:dp[i][0]表示不選擇 i 時,以它為根的子樹最多可選出的人數;dp[i][1]表示選擇 i 時,以它為根的子樹最多可選出的人數。sole[i][0]表示不選擇 i 時,最優方案是否唯一;sole[i][1]表示選擇 i