zoukankan      html  css  js  c++  java
  • UVA10271

     1 /* 
     2 题意: 有t组测试数据,给出n,m. m个数升序,要从m个数中选出n+8对三元组。
     3 要求这三个数x<=y<=z, 其中每对的代价为(x-y)^2。
     4 问最小的代价是多少。
     5 分析:
     6 定义 dp[i][j] 为从 i 根筷子里选出 j 对。
     7 除了最长的那根筷子,其余两根一定相邻,因为只有这样代价才最小 ,
     8 那么只要降序排列,且 i>=j*3 就可以有更长的筷子与选出来的两根配对。 
     9 对于第 i 根筷子,
    10 如果不参与第 j 对 ,那么问题转化成从 i-1 根里选 j 对;
    11 如果参与,那么就是从 i-2 根里选 j-1 对。即有: 
    12 dp[i][j]=min(dp[i-1][j],dp[i-2][j-1]+(a[i]-a[i-1])^2); 
    13 
    14 */
    15 #include<cstdio>
    16 #include<algorithm>
    17 #include<cstring>
    18 #define MAX 999999999
    19 using namespace std;
    20 int dp[5010][1010],a[5010];
    21 int main()
    22 {
    23     int t,n,m;
    24     scanf("%d",&t);
    25     while(t--)
    26     {
    27         scanf("%d%d",&n,&m);
    28         n+=8;
    29         for(int i=m;i>0;i--)
    30             scanf("%d",&a[i]);
    31         for(int i=1;i<=m;i++)
    32         {
    33             dp[i][0]=0;
    34             for(int j=1;j<=n;j++)
    35                 dp[i][j]=MAX;
    36         }        
    37         for(int i=3;i<=m;i++)
    38         {
    39             for(int j=1;j<=n;j++)
    40             {
    41                 if(i>=j*3 && dp[i-2][j-1]!=MAX)
    42                 dp[i][j]=min(dp[i-1][j], dp[i-2][j-1]+(a[i]-a[i-1])*(a[i]-a[i-1]) );
    43             }
    44         }
    45         printf("%d
    ",dp[m][n]);
    46     }    
    47     return 0;    
    48 }
  • 相关阅读:
    IntelliJ IDEA 设置代码提示或自动补全的快捷键
    spring框架学习(一)
    java数据库连接池技术原理(浅析)
    Spring事务管理
    Android invalidate 用法
    sharedPreferences存储文件
    Android Service组件
    SQLite版本升级
    在android.app.Application中定义全局变量 .
    android观察者模式
  • 原文地址:https://www.cnblogs.com/ember/p/4890412.html
Copyright © 2011-2022 走看看