UVA 11766 Racing Car Computer --DP

來源:互聯網
上載者:User

標籤:style   blog   http   color   os   資料   io   art   

題意:電腦記錄了某一時刻每個賽車的前面和後面個有多少輛車(多個車並排時在別的車那隻算一輛),問最少有多少個不合理的資料。

分析:看到n<=1000時,就盡量往DP上想吧。 

每輸入一組資料a,b,如果a+b>=n肯定不行,加上自己就超過n了。否則這個車肯定在(a+1,n-b)這段區間內,所以這段區間內的車子數(cnt[][]記錄)++,如果車子數大於區間長度,就不再加了。搞完輸入資料後,再來DP:

定義:dp[i] :前 i 輛車最多有多少車位置合理

則有方程: dp[i] = min(dp[j]+cnt[j+1][i]) (0<= j < i )

即前 i 輛車最多的合理位置車數等於前 j 輛車最多合理位置車數加上 j~i 這段位置中的合理位置車數(cnt[][]記錄的都是合理位置車數)

代碼:

#include <iostream>#include <cstdio>#include <cstring>#include <cmath>#include <algorithm>using namespace std;#define N 1507int dp[N];int cnt[N][N];int main(){    int cs = 1,n,i,j;    int a,b;    while(scanf("%d",&n)!=EOF && n)    {        memset(cnt,0,sizeof(cnt));        memset(dp,0,sizeof(dp));        for(i=1;i<=n;i++)        {            scanf("%d%d",&a,&b);            if(a+b >= n)                continue;            cnt[a+1][n-b]++;            if(cnt[a+1][n-b] > n-b-a)   //不能超過區間長度                cnt[a+1][n-b] = n-b-a;        }        for(i=1;i<=n;i++)        {            for(j=0;j<i;j++)            {                dp[i] = max(dp[i],dp[j]+cnt[j+1][i]);            }        }        printf("Case %d: %d\n",cs++,n-dp[n]);    }    return 0;}
View Code
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.