鏈結
首先發現移動火柴操作可以放到最後做。每一次移動火柴一定可以看做是新增一根火柴再刪除一根火柴,並且可以將任意一次新增和一次刪除操作合併為一次移動操作,那麼可以考慮只使用新增和刪除操作,最後再計算出當前情況下使用幾次移動操作最優。
然而發現並不清楚優先選擇新增還是刪除,但是我們知道當新增操作次數相同時,刪除操作越少越優,所以可以 \(\text\),用狀態 \(f[i][j]\) 表示當前考慮了前 \(i\) 個數字,當前的新增運算元量為 \(j\) 時的最少刪除操作次數。
得到這個之後,對於每一對新增運算元量和刪除運算元量,可以三分出移動運算元量或者直接列舉取最優解。
#include#include#include#includeusing namespace std;
const int maxn=205;
const int inf=0x7f7f7f7f7f;
int dp[maxn][505],p[5],q[5],n,ad[10][10],de[10][10];
int num[10][8]=,,,,,,,,,};
char a[maxn],b[maxn];
int as(int s,int f)
int ds(int s,int f)
int getans(int i,int j)
return ans;
}int main()
}for(i=0;i=add)
dp[m][i]=min(dp[m][i],dp[m-1][i-add]+del);
}for(i=0;i<505;i++)
if(dp[n][i]!=inf)
ans=min(ans,getans(i,dp[n][i]));
printf("%d",ans);
return 0;
}
題解 SHOI2012 隨機樹
題目傳送門 不難看出,答案就是 1 sum 2 i 1 這個問真的很仙。可 bu 以 neng 想到,我們可以設 f 表示有 i 個葉子時深度 ge j 的概率,可以得到轉移式 f frac sum f f f times f 可以直接除以 i 1 是因為可以證明把兩顆子樹合併,只要總大小相同,那麼...
SHOI2012 隨機樹 期望dp
初始 1 個節點,每次選定乙個葉子節點並加入兩個兒子直到葉子總數為 n 問葉子節點深度和的平均值的期望以及最大葉子深度的期望。n leq 100 p frac frac frac 2p 也就有 f i f frac g sum p sum x sum y max x,y 1 j g g includ...
SHOI2012 回家的路
shoi2012 d2t1 2046 年 oi 城的城市軌道交通建設終於全部竣工,由於前期規劃周密,建成後的軌道交通網路由2n2n條地鐵線路構成,組成了乙個nn縱nn橫的交通網。如下圖所示,這2n2n條線路每條線路都包含nn個車站,而每個車站都在一組縱橫線路的交匯處。出於建設成本的考慮,並非每個車站...