Ural 1167 Bicolored Horses (DP)

题目地址:Ural 1167

感觉这题的思路类似于背包的做法。。

先预处理出来每个马与之前所有的马的0的数量和1的数量,用数组a[0][i]和a[1][i]来表示。

然后再用数组dp[i][j]来表示当前第i个马槽最右端为第j个马时的最小值。

dp的时候先枚举马槽,再用n*n枚举当前的马槽要选用的马的区间。这样总时间复杂度是O(n*n*k)。

代码如下:

#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <stdlib.h>
#include <math.h>
#include <ctype.h>
#include <queue>
#include <map>
#include <set>
#include <algorithm>

using namespace std;
const int INF=0x3f3f3f3f;
#define LL long long
int a[3][600], dp[600][600], c[600];
int main()
{
    int n, k, i, j, x, h;
    c[0]=0;
    scanf("%d%d",&n,&k);
    for(i=1; i<=n; i++)
    {
        scanf("%d",&c[i]);
    }
    a[0][0]=0;
    a[1][0]=0;
    for(i=1; i<=n; i++)
    {
        a[0][i]=c[i]==0?a[0][i-1]+1:a[0][i-1];
        a[1][i]=c[i]==1?a[1][i-1]+1:a[1][i-1];
    }
    memset(dp,INF,sizeof(dp));
    dp[0][0]=0;
    for(i=1;i<=k;i++)
    {
        for(j=1;j<=n;j++)
        {
            for(h=0;h<j;h++)
            {
                dp[i][j]=min(dp[i][j],dp[i-1][h]+(a[0][j]-a[0][h])*(a[1][j]-a[1][h]));
            }
        }
    }
    printf("%d\n",dp[k][n]);
    return 0;
}
时间: 2024-11-05 05:17:38

Ural 1167 Bicolored Horses (DP)的相关文章

URAL 1167. Bicolored Horses (DP)

题目链接 题意 :农夫每天都会放马出去,然后晚上把马赶入马厩,于是让马排成一行入马厩,但是不想马走更多的路,所以让前p1匹入第一个马厩,p2匹马入第二个马厩…………但是他不想让他的任何一个马厩空着,所有的马都必须入马厩.有两种颜色的马,如果 i 匹黑马与 j 匹白马同在一个马厩,不愉快系数是 i * j,总系数就是k个系数相加.让总系数最小. 思路 : dp[i][j] 代表的是前 i 个马厩放 j 匹马的最小不愉快系数值. 1 //1167 2 #include <cstdio> 3 #in

递推DP URAL 1167 Bicolored Horses

题目传送门 1 /* 2 题意:k个马棚,n条马,黑马1, 白马0,每个马棚unhappy指数:黑马数*白马数,问最小的unhappy指数是多少 3 状态转移方程:dp[i][l] = min (dp[i][l], dp[i-1][j] + cur * (l - j - cur)) 表示第l匹马要不还在i马棚,或者去新的马棚 4 本题关键在dp初始化INF,由于黑马白马的表示简单,求指数方便 5 */ 6 #include <cstdio> 7 #include <iostream>

URAL 1073 Square Country(DP)

Square Country 大意: 买一块边长为 a 的正方形地需要的钱数是 a^2, 现在输入N为钱的数目,求最少购买地的块数可以凑够N. 思路:DP,由背包思想推出来的dp[i] = min(dp[i], dp[j-i*i]+1);  方块都是由正方形组成的,所以是i*i,循环的时候也是i*i. #include <stdio.h> #define min(a, b) ((a) > (b) ? (b) :(a)) int n; int dp[60005]; int main() {

ural Bicolored Horses(二维dp)

http://acm.timus.ru/problem.aspx?space=1&num=1167 有n个马,黑白两种,依次放入k个马厩,将x匹马放在一个马厩的不快乐值为黑马数目*白马数目.问最后的不快乐值最小是多少? 设dp[i][j]表示前i个马厩放了j匹马的最小不快乐值,那么dp[i][j] = min(dp[i-1][g]+tmp[g+1][j]). 其中tmp是预处理的i到j匹马的不快乐值. #include <stdio.h> #include <iostream&g

Ural 1119 Metro(DP)

题目地址:Ural 1119 因为还有一个可不可以穿的问题,所以需要再加一维.0代表可穿不可穿,可穿设置成0,不可穿就设置成无穷大.1代表当前这格的最短距离. 代码如下: #include <iostream> #include <cstdio> #include <string> #include <cstring> #include <stdlib.h> #include <math.h> #include <ctype.h

URAL 1142. Relations(dp啊)

题目链接:http://acm.timus.ru/problem.aspx?space=1&num=1142 1142. Relations Time limit: 1.0 second Memory limit: 64 MB Background Consider a specific set of comparable objects. Between two objects a and b, there exits one of the following three classified

URAL 1183 Brackets Sequence DP 路径输出

题意:长度小于100的字符串s只由四种字符"()[]"组成,求以该串为子串的最短的合法串.合法串递归定义为: (1)空串合法 (2)如果S合法,则(S).[S]合法 (3)如果A.B合法,则AB合法 思路: 设dp[i][j]为s(i,j)变为合法串后,合法串的长度或需要添加的字符的个数,状态转移: (1)如果s[i]和s[j]匹配,dp[i,j]=dp[i+1,j-1]. (2)如果不匹配,划分s(i,j)为s(i,k)和s(k+1,j),划分后dp[i,j]=dp[i,k]+dp[

URAL 1244. Gentlemen (DP)

题目链接 题意 : 给出一幅不完全的纸牌.算出哪些牌丢失了. 思路 : 算是背包一个吧.if f[j]>0  f[j+a[i]] += f[j];然后在记录一下路径. 1 //1244 2 #include <stdio.h> 3 #include <string.h> 4 #include <iostream> 5 6 using namespace std ; 7 8 int a[1100000] ,b[1010000]; 9 int dp[1010000]

ural 1009. K-based Numbers dp 高精度

点击打开链接 1009. K-based Numbers Time limit: 1.0 second Memory limit: 64 MB Let's consider K-based numbers, containing exactly N digits. We define a number to be valid if itsK-based notation doesn't contain two successive zeros. For example: 1010230 is a