原题地址:http://www.rqnoj.cn/problem/273

题目大意:中文题不说了。

设从第i匹马到第j-1匹马放在一个马棚里得到的系数为f(i,j)。

状态表示:dp[i][j]表示前i匹马用j个分隔(j+1个马棚)分隔得到的最小的系数。则最后要求的就是dp[n][k-1]。

初始状态:dp[i][0]=f(0,i)

状态转移方程:

  dp[i][j]=min{  dp[ii][j-1]+f(ii,i),(j<=ii<i)  }

  即:要求dp[i][j](前i匹马用j+1个马棚分隔得到的最小的系数),假设最后的1个独自关一个马棚,会得到dp[i-1][j-1];假设最后两个独自关一个马棚,会得到dp[i-2][j-1]+最后两匹马关一起的系数。。。在这些情况中,选择一个最小的作为dp[i][j]的值。

解题代码:

 #include<stdio.h>
#include<iostream>
using namespace std;
int dp[][];
int a[];
int ans[][];
int main()
{
int n,k,i,j,ii;
scanf("%d%d",&n,&k);
for(i=;i<n;i++)
{
scanf("%d",&a[i]);
}
for(i=;i<n;i++)
{
int nn[]={,};
for(j=i+;j<=n;j++)
{
nn[a[j-]]++;
ans[i][j]=nn[]*nn[];
}
}
for(i=;i<=n;i++)
dp[i][]=ans[][i];
for(j=;j<k;j++)
{
for(i=j+;i<=n;i++)
{
dp[i][j]=<<;
for(ii=j;ii<i;ii++)
{
int m=dp[ii][j-]+ans[ii][i];
dp[i][j]=dp[i][j]<m?dp[i][j]:m;
}
}
}
printf("%d\n",dp[n][k-]);
return ;
}

最新文章

  1. MongoDB集群卡死问题
  2. RDS MySQL 空间问题的原因和解决
  3. svn patch
  4. 用VC进行COM编程所必须掌握的理论知识
  5. 《BI那点儿事》Microsoft 时序算法——验证神奇的斐波那契数列
  6. BOM&amp;Navigator对象
  7. Lock的基础概念
  8. DataGridView 添加行号
  9. 结束日期必须大于开始日期--My97DatePicker日历控制的又一方便之处
  10. Ubuntu 16.04 TensorFlow CPU 版本安装
  11. 【多线程】Java并发编程:并发容器之CopyOnWriteArrayList(转载)
  12. foxtable使用笔记
  13. 如何用java实现使用电子邮件控制你的电脑
  14. Opencv——彩色图像灰度化的三种算法
  15. python下调用pytesseract识别某网站验证码
  16. ccf-命令行选项-201403-3
  17. 【转】Sqlserver将数据从一个表插入到另一个表
  18. Excel 整个列数字转换成文本
  19. LeetCode赛题515----Find Largest Element in Each Row
  20. 优先队列之二叉堆与d-堆

热门文章

  1. BackgroundWorker组件
  2. 记一段使用node对mysql数据库做处理
  3. linux ps命令详解
  4. Linux:-bash: ***: command not found
  5. JAVA数据库连接池实现(转)
  6. 创业者拿到融资别高兴太早,当心TS中的优先清算权
  7. SQL Server -&gt;&gt; 生成Numbers辅助表
  8. Struts2入门学习
  9. [转]“WARNING: soft rlimits too low” in MongoDB with Mac OS X
  10. bootstrap table 服务器端分页例子