hdu 1421 搬寝室 DP
2015-12-02 19:05
405 查看
思路:dp[i][j] = min(dp[i-2][j-1] + (val[i]-val[i-1])*(val[i]-val[i-1]),dp[i-1][j]); dp[i][j]代表在i件物品中取j对的最小的结果。
http://acm.hdu.edu.cn/showproblem.php?pid=1421#include <map> #include <set> #include <queue> #include <cmath> #include <ctime> #include <cstdio> #include <cstring> #include <cstdlib> #include <iostream> #include <algorithm> #define rep(i,a,b) for(int i = a ; i <= b ; i ++) #define rrep(i,a,b) for(int i = b ; i >= a ; i --) #define repE(p,u) for(Edge * p = G[u].first ; p ; p = p -> next) #define cls(a,x) memset(a,x,sizeof(a)) using namespace std; typedef long long LL; const int MOD = 1e9+7; const int INF = 0x3f3f3f3f; const int MAXN = 2e3+5; const int MAXE = 1e6+5; int T,n,m; int val[MAXN]; int dp[MAXN][MAXN]; void input() { rep(i,1,n) { scanf("%d",val+i); } } void solve() { sort(val+1,val+n+1); cls(dp,0x3f); dp[0][0] = 0 ; dp[1][0] = 0; rep(i,2,n) { dp[i][0] = 0; rep(j,1,i/2) { dp[i][j] = min(dp[i-2][j-1]+(val[i]-val[i-1])*(val[i]-val[i-1]),dp[i-1][j]); } } printf("%d\n",dp [m]); } int main(void) { //freopen("a.in","r",stdin); //scanf("%d",&T); while(~scanf("%d %d",&n,&m)) { input(); solve(); } return 0; }
相关文章推荐
- iOS快速开发框架--Bee Framework
- oc中的串行、并行与同步、异步
- 解决bootstrap中轮播插件支持手机上的手势滑动的问题
- 枚举
- 它将被转换到一个函数来显示数据行以逗号分隔的数据列在一排
- MongoDB 文档的更新操作
- poj 3723 Conscription 并查集+Kruskal 求最小生成树
- Wee5-4PP attachment 3
- Web开发2015年十大趋势
- 数据结构——程序性能分析
- LinkedList,双向链表的实现
- 泛型操作范例
- 全功能智能车之再完善电路图(第十八篇)
- 用DEV做的,运行时程序停止
- 我对JS的理解
- jquery格式化时间,拼接DateTime时间
- 双目立体视觉系统精度分析
- fzu月赛(2015.11)
- oc中的copy与mutableCopy
- java中static和final关键字