洛谷 P1282 多公尺諾骨牌

2022-05-10 06:08:08 字數 863 閱讀 8497

這道題是一道揹包問題,考慮乙個揹包,

顯然如果我們直接設dp[i]表示前i個使差值最小所需的最少翻轉次數,是具有後效性的。

所以我們將直接求最值,改為求某個值是否可行,這種求最值轉變為求可行性的思想是非常實用的。

狀態 dp[i][j]表示使用前i個物品修改得到差值j的最小步數。

第一步求出原來兩個陣列的總和的差值delta(dd)是多少。

第二步進行揹包dp,每個物品的質量為:t=a[i]-b[i],列舉改或不改,這樣做相當於是我們企圖去彌補兩個陣列和的差異delta。

第三步就是找到乙個能夠構造出來的最小的delta就行啦。,對負數的處理可以直接加上乙個很大的n。

初始化dp[0][dd]=0,其餘全為inf

轉移方程 dp[i][j]=min(dp[i][j],dp[i-1][j]);

dp[i][j]=min(dp[i][j],dp[i-1][j-2*t]+1);

#include #include #include #include #include #include using namespace std;

const int maxn=1005,maxm=maxn*5;

int init()

while(c>='0'&&c<='9')

return rv*fh;

}int dp[maxn][(maxm<<1)+maxn];

int main()

} for(int i=0;i<=maxm;i++)

if(dp[n][maxm+i]<=2005)

} fclose(stdin);

return 0;

}

洛谷 P1282 多公尺諾骨牌

題目描述 多公尺諾骨牌有上下2個方塊組成,每個方塊中有1 6個點。現有排成行的 上方塊中點數之和記為s1,下方塊中點數之和記為s2,它們的差為 s1 s2 例如在圖8 1中,s1 6 1 1 1 9,s2 1 5 3 2 11,s1 s2 2。每個多公尺諾骨牌可以旋轉180 使得上下兩個方塊互換位置...

洛谷p1282多公尺諾骨牌

多公尺諾骨牌有上下2個方塊組成,每個方塊中有1 6個點。現有排成行的 上方塊中點數之和記為s1,下方塊中點數之和記為s2,它們的差為 s1 s2 例如在圖8 1中,s1 6 1 1 1 9,s2 1 5 3 2 11,s1 s2 2。每個多公尺諾骨牌可以旋轉180 使得上下兩個方塊互換位置。程式設計...

洛谷p1282多公尺諾骨牌

大佬的思路 這其實是一道 披著狼皮的揹包題 我們只需要對狀態稍作調整就可以套揹包啦 我們先把骨牌翻轉,調整至點數大的在上面 這樣,我們就能保證上方的點數一定比下方大,並且保證每翻轉一 次,都能使上下的點數之差變小,而變小的點數,就是上下點數之差乘以2。把改變的點數看成物品的體積,初始上下方的點數之差...