HDU 1227(区间dp)

本文介绍了一个使用C++实现的动态规划算法案例,通过该算法可以有效地解决一类特定问题。该程序首先读取输入数据,然后利用动态规划的方法进行处理,最终输出问题的解决方案。代码中使用了数组和循环来存储和更新状态,通过不断优化子问题的解来得到全局最优解。

#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<vector>
#include<algorithm>
#include<iostream>
#include<time.h>
using namespace std;

int dp[35][205];
int pos[205];
int f[205][205];
const int INF = 0x3f3f3f3f;

int main()
{
    int n, k;
    int cas = 1;
    while (scanf("%d%d", &n, &k) != EOF, n)
    {
        int i, j, len;
        memset(f, 0, sizeof(f));
        for (i = 1; i <= n; i++)
        {
            scanf("%d", &pos[i]);
        }
        memset(dp, INF, sizeof(dp));
        for (i = 1; i <= n; i++)
        {
            for (j = i + 1; j <= n; j++)
            {
                for (len = i; len <= j; len++)
                    f[i][j] += abs(pos[(i + j) / 2] - pos[len]);
            }
        }
        int q;
        for (i = 1; i <= n; i++)
        {
            dp[1][i] = f[1][i];
        }
        for (i = 2; i <= k; i++)
        {
            for (j = i; j <= n; j++)
            {
                for (q = i; q <= j; q++)
                    dp[i][j] = min(dp[i][j], dp[i - 1][q-1] + f[q][j]);
            }
        }
        printf("Chain %d\nTotal distance sum = %d\n\n", cas++, dp[k][n]);
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值