• UVA 11766 Racing Car Computer --DP


    题意:电脑记录了某一时刻每个赛车的前面和后面个有多少辆车(多个车并排时在别的车那只算一辆),问最少有多少个不合理的数据。

    分析:看到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 1507
    
    int 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
    ",cs++,n-dp[n]);
        }
        return 0;
    }
    View Code
  • 相关阅读:
    敏捷的调试
    敏捷的编码
    敏捷的需求分析
    敏捷的反馈
    敏捷的方法论
    敏捷的世界观
    MarkDown添加数学公式
    性能分析初学者指南
    可执行文件的装载与进程
    会话技术------客户端技术cookie
  • 原文地址:https://www.cnblogs.com/whatbeg/p/3866494.html
Copyright © 2020-2023  润新知