標籤: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