1. 程式人生 > >uva 10271 Chopsticks 【dp】

uva 10271 Chopsticks 【dp】

題目:uva 10271Chopsticks

題意:從一組數中選出每三個為一組,價值為三個中兩個小的差值的平方和,讓這個總價值最小。

分析:定義dp【i】【j】為從後 i 箇中選出 j 對的最小价值。

轉移方程:dp【i】【j】 = min(dp【i-1】【j】,dp【i+2】【j-1】+(a【i】-a【i+1】)*(a【i】-a【i+1】))

注意狀態轉移的條件:就是每組要保留一個最大的值作為第三個值。

AC程式碼:

 
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <vector>
#include <queue>
typedef long long ll;
using namespace std;
const int inf = 0x3f3f3f3f;
const int N = 5500;
int a[N];
int dp[N][2000];
int cmp(int x,int y)
{
    return x>y;
}
int main()
{
    int pro,n;
    while(~scanf("%d%d",&pro,&n))
    {
        memset(dp,inf,sizeof(dp));
        for(int i=n; i>=1; i--)
            scanf("%d",&a[i]),dp[i][0]=0;
        sort(a+1,a+n+1,cmp);
        for(int i=3;i<=n;i++)
        {
            for(int j=1;j<=min(pro,i/3);j++)
                    dp[i][j]=min(dp[i-1][j],dp[i-2][j-1]+(a[i]-a[i-1])*(a[i]-a[i-1]));
        }
        printf("%d\n",dp[n][pro]);
    }
    return 0;
}        


相關推薦

uva 10271 Chopsticks dp

題目:uva 10271Chopsticks 題意:從一組數中選出每三個為一組,價值為三個中兩個小的差值的平方和,讓這個總價值最小。 分析:定義dp【i】【j】為從後 i 箇中選出 j 對的最小价值。 轉移方程:dp【i】【j】 = min(dp【i-1】【j

DPUVA 624 CD 記錄路徑

type space bre ++ algo void ont efi 數組 開一個數組p 若dp[i-1][j]<dp[i-1][j-a[i]]+a[i]時就記錄下p[j]=a[i];表示此時放進一個軌道 遞歸輸出p #includ

UVA 567 Riskfloyd

art printf ios org std span app process iostream 題目鏈接: option=com_onlinejudge&Itemid=8&page=show_problem&problem=5

DP青蛙過河

現在 div col 接受 printf mic ive 開始 可能 Description   在河上有一座獨木橋,一只青蛙想沿著獨木橋從河的一側跳到另一側。在橋上有一些石子,青蛙很討厭踩在這些石子上。由於橋的長度和青蛙一次跳過的距離都是正整數,我們可以把獨木橋上青蛙

DP最長公共子序列

amp 給定 scrip ros script print 最長 去掉 != Description   字符序列的子序列是指從給定字符序列中隨意地(不一定連續)去掉若幹個字符(可能一個也不去掉)後所形成的字符序列。令給定的字符序列X=“x0,x1,…,xm-1”,序列Y

hdoj-1421-搬寢室DP

循環 efi names sort pac ane recommend 7月 set 搬寢室 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Tot

HDU2577 How to TypeDP

print data 輸出 指示燈 char tchar set 狀態 初始 題目鏈接: http://acm.hdu.edu.cn/showproblem.php?pid=2577 題目大意: 給你一個僅僅包括大寫和小寫字母的字符串,如今Pirates要從鍵盤上

vijos 1037 搭建雙塔 DP

algo ostream isp 不知道 cout space aps 我們 blog % 這題是小貓給我講的 % 題目: Mr. F有N塊水晶,每塊水晶有一個高度,他想用這N塊水晶搭建兩座有同樣高度的塔,使他們成為一座雙塔,Mr. F可以從這N塊水晶中任取M(1≤M≤N

2017省夏令營Day6 dp

數列 .com ffffff div print display ring 成了 play 題解:區間dp,f[i][j]表示區間[i,j]的狼全部消滅的最小代價,設k為i、j間任意一點(i<=k<=j),且第k只狼被最後消滅,顯然,區間總代價即可被我們

hdu 1078 FatMouse and Cheesedp

mark .text ani addclass data dcl process con word 題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=1078 題意:每次僅僅能走 橫著或豎著的 1~k 個格

HDU1024 Max Sum Plus Plus DP

ext itl tex efi elves ron weight mic all Max Sum Plus Plus Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K

DPBullcow

std 環境 llc 幫助 描述 想要 code 這一 int 描述 一年一度的展會要來臨了,農民約翰想要把N(1 <= N <= 100,000)只奶牛和公牛安排在單獨的一行中。 約翰發現最近公牛們非常好鬥;假如兩只公牛在這一行中靠的太近,他們就會吵架,以至於

UVA 10048 Audiophobia floyd

blog case ret https amp set continue turn 鏈接 題目鏈接: https://vjudge.net/problem/UVA-10048 中文大意: 現在有一個無向圖,有C個點,S個邊,Q個詢問。 每條邊有一個權值代表噪音值。若想從u走

計算幾何DPtarjanDay 10.6

long long pri cout logs 前綴 ret ble freopen style T1 計算幾何+遞推 1 #include <cstdio> 2 #include <cmath> 3 double w,x,r; 4 int

dp背包問題

end span asc bits nms tiny mrm roc got 01背包 吶,為什麽叫它01背包呢,因為裝進去就是1,不裝進去就是0.所以針對每個物品就兩種狀態,裝,不裝(請允許我用這麽老套的開篇,相信聽過很多次背包講解的人,大多都是這個開篇的)所以咯,

dp狀壓dp

etc bottom ret tom ldh ann 題目 無法 space 二進制的力量 狀態壓縮DP 憤怒的小鳥 第一次接觸狀態壓縮DP是在NOIP2016的憤怒的小鳥,當時菜得連題目都沒看懂,不過現在回過頭來看還是挺簡單的,那麽我們再來看看這道題吧。 題意

BZOJ1801 [Ahoi2009]chess 中國象棋 dp

pri name include 題解 中國象棋 c++ down 不同 ostream 題目 在N行M列的棋盤上,放若幹個炮可以是0個,使得沒有任何一個炮可以攻擊另一個炮。 請問有多少種放置方法,中國像棋中炮的行走方式大家應該很清楚吧. 輸入格式 一行包含兩個整數N,M,

DP洛谷1004方格取數

一個 應該 什麽 == 美的 ret cstring clas bool 題目在這裏 首先想到的是DFS,附上80分代碼(不知道為什麽WA了一個點): #include <cstdio> #include <cstring> #def

BZOJ2302 [HAOI2011]Problem c dp

red 多少 void ons sum ems () \n 直接 題目 給n個人安排座位,先給每個人一個1~n的編號,設第i個人的編號為ai(不同人的編號可以相同),接著從第一個人開始,大家依次入座,第i個人來了以後嘗試坐到ai,如果ai被占據了,就嘗試ai+1,ai+1也

BZOJ2121 字符串遊戲 dp

bzoj 匹配 -- 如何 斷點 print space %d const 題目鏈接 BZOJ2121 題解 dp怎麽那麽神吶QAQ 我們要求出最小字符串長度 我們設一個\(dp[i]\)表示前\(i\)個字符最後所形成的最短字符串長度 對於第\(i\)個字符,要麽保留,就