URAL 1167 Bicolored Horses(DP)
2014-07-29 09:11
225 查看
Bicolored Horses
大意:给你N匹马,K个马厩,每一个马都只会是0或1,每一个马厩里会有一个不快乐值(不快乐值=0马的个数*1马的个数),问怎么分配会得出一个最小的不快乐值,输出最小的不快乐值。
思路:先(n^2)处理出来每个区间中的不快乐值,再用DP求解出K个马厩的最小不快乐值。
dp[i][j], i表示当前是分配的第几个马厩,j表示当前分配的是第几个马。
大意:给你N匹马,K个马厩,每一个马都只会是0或1,每一个马厩里会有一个不快乐值(不快乐值=0马的个数*1马的个数),问怎么分配会得出一个最小的不快乐值,输出最小的不快乐值。
思路:先(n^2)处理出来每个区间中的不快乐值,再用DP求解出K个马厩的最小不快乐值。
dp[i][j], i表示当前是分配的第几个马厩,j表示当前分配的是第几个马。
/************************************************************************* > File Name: URAL1167.cpp > Author: GLSilence > Created Time: 2014年07月29日 星期二 08时30分30秒 ************************************************************************/ #include<stdio.h> #include<iostream> using namespace std; const int INF = 0x7ffffff; int a[505]; int b[505][505], c[505][505]; int sum[505][505]; int dp[505][505]; int main() { int n, k; scanf("%d%d", &n, &k); for(int i = 1; i <= n; ++i){ scanf("%d", &a[i]); dp[0][i]= INF; } for(int i = 1; i <= n; ++i){ for(int j = i; j <= n; ++j){ if(a[j] == 0){ b[i][j] = b[i][j-1]+1, c[i][j] = c[i][j-1]; } else{ b[i][j] = b[i][j-1], c[i][j] = c[i][j-1]+1; } sum[i][j] = b[i][j]*c[i][j]; } } int p; for(int i = 1; i <= k; ++i){ for(int j = 1; j <= n; ++j){ int Min = INF; for(int t = 1; t <= j; ++t){ p = dp[i-1][t-1]+sum[t][j]; Min = min(Min, p); } dp[i][j] = Min; } } printf("%d\n", dp[k] ); return 0; }
相关文章推荐
- 【Ural1167】 Bicolored Horses——基础Dp
- 递推DP URAL 1167 Bicolored Horses
- Ural 1167 Bicolored Horses (DP)
- Ural 1167. Bicolored Horses DP
- ural 1005. Stone Pile -01背包-dp
- DP+高精度 URAL 1036 Lucky Tickets
- ☆URAL 2018 The Debut Album (dp 两种写法)
- URAL 1287. Mars Canals 滚动数组+DP
- URAL -1167 Bicolored Horses
- 【DP】URAL 2018 The Debut Album
- ural 1018 Binary Apple Tree 树形dp
- 【BZOJ1814】Ural 1519 Formula 1 插头DP
- URAL 1031 很简单的DP..
- URAL 1108 简单的树形dp背包问题
- URAL 1057 Amount of Degrees(数位DP)
- ural 1519 Formula 1(插头dp)
- URAL 1018 Binary Apple Tree(树DP)
- Ural 1260. A nudnik photographer(dp)
- bzoj 1814: Ural 1519 Formula 1 插头dp经典题
- ural 1029. Ministry (dp)