zoukankan      html  css  js  c++  java
  • AOJ895 艰难取舍【DP】

    题目:

    Description 
    由于 lls 长得实在是太帅了,英俊潇洒,风流倜傥,人见人爱,花见花开,车见车载。有一群 MM 排队看 lls。每个 MM 都有自己独特的风格,由于 lls 有着一颗包容的心,所以,什么风格的 MM 他都喜欢……但是,lls 有一个特别的要求,他不希望总是看到风格得差不多的 MM,更加特别的是,如果两个 MM 风格完全一样, lls 不会有任何意见。现在, lls 希望从去看他的 MM 中,去掉一些 MM,从而使得相邻 2 个 MM 的风格值的差(绝对值)不为 1。自然地, lls 希望去掉的 MM 越少越好。

    Input 
    第一行一个整数 N; 
    第 2~N+1 行 N 个整数,第 i 个为 ci。表示第 i 个 MM 的风格值。

    Output 
    一个数,表示最少要去掉的 MM 数。

    Sample Input 






    1

    Sample Output 
    2

    Hint 
    N≤1000,0 ≤ ci ≤ 2000

    大致思路:

    问需要减去多少个人,那么可以转化为最多有多少个人满足要求。 
    可以利用DP的思想求解: 
    dp[i] 代表前i个人中最多留下的人数。 
    则状态转移方程为:

        for(int i=1;i<=n;++i)
            for(int j=0;j<i;++j)
                if(abs(a[i]-a[j])!=1)//表示符合条件的人
                    dp[i]=max(dp[i],dp[j]+1);//取最优

    代码:

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 const int maxn=10010;
     4 int a[maxn],dp[maxn];
     5 int main()
     6 {
     7     ios::sync_with_stdio(false);
     8     //freopen("in.txt","r",stdin);
     9     int n,ans=0;
    10     cin>>n;
    11     for(int i=1;i<=n;++i)
    12         cin>>a[i];
    13     memset(dp,0,sizeof(dp));
    14     for(int i=1;i<=n;++i)
    15         for(int j=0;j<i;++j)
    16             if(abs(a[i]-a[j])!=1)
    17                 dp[i]=max(dp[i],dp[j]+1);
    18     for(int i=1;i<=n;++i)//取人数最多的情况
    19         ans=max(dp[i],ans);
    20     cout<<n-ans<<endl;
    21     return 0;
  • 相关阅读:
    Coursera机器学习week11 单元测试
    关于 TypeReference 的解释
    getModifiers 方法解释。
    instanceof isInstance isAssignableFrom 比较
    elasticsearch 基础 语法总结
    kibana 启动 关闭 和进程查找
    MD5 SHA1 SHA256 SHA512 SHA1WithRSA 的区别
    spring boot 项目 热启动
    java zip 压缩文件
    Packet for query is too large (1660 > 1024). You can change this value on the server by setting the max_allowed_packet' variable.
  • 原文地址:https://www.cnblogs.com/SCaryon/p/7375062.html
Copyright © 2011-2022 走看看