【解题报告】[动态规划] RQNOJ - PID273 / 马棚问题
2024-09-14 09:40:29
原题地址: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 ;
}
最新文章
- MongoDB集群卡死问题
- RDS MySQL 空间问题的原因和解决
- svn patch
- 用VC进行COM编程所必须掌握的理论知识
- 《BI那点儿事》Microsoft 时序算法——验证神奇的斐波那契数列
- BOM&;Navigator对象
- Lock的基础概念
- DataGridView 添加行号
- 结束日期必须大于开始日期--My97DatePicker日历控制的又一方便之处
- Ubuntu 16.04 TensorFlow CPU 版本安装
- 【多线程】Java并发编程:并发容器之CopyOnWriteArrayList(转载)
- foxtable使用笔记
- 如何用java实现使用电子邮件控制你的电脑
- Opencv——彩色图像灰度化的三种算法
- python下调用pytesseract识别某网站验证码
- ccf-命令行选项-201403-3
- 【转】Sqlserver将数据从一个表插入到另一个表
- Excel 整个列数字转换成文本
- LeetCode赛题515----Find Largest Element in Each Row
- 优先队列之二叉堆与d-堆
热门文章
- BackgroundWorker组件
- 记一段使用node对mysql数据库做处理
- linux ps命令详解
- Linux:-bash: ***: command not found
- JAVA数据库连接池实现(转)
- 创业者拿到融资别高兴太早,当心TS中的优先清算权
- SQL Server ->;>; 生成Numbers辅助表
- Struts2入门学习
- [转]“WARNING: soft rlimits too low” in MongoDB with Mac OS X
- bootstrap table 服务器端分页例子