zoj3161 DP

将自己历史的AC共享

zoj3161 DP题

dp[i] = max( min(dp[j-1]+dp[i-j],dp[j]+dp[i-j-1]),1<=j< i )

//1767788 2009-02-20 10:53:25 Accepted  3161 C++ 100 1176 green tea 
#include <cstdio>
#include <algorithm>
using namespace std;

//当确定出一个情侣的序列时,会员们会尽最大的努力使跑掉的人最多。问题是帮管家确定一个序列,使留下来的人最多。
//假设有 i 个连续的人,每相邻两个都有 8g 关系,管家给出一个序列使留下最多 dp[i] 个人
//管家给出的第一个序列可能是 (j, j + 1) 这时第 j 个人或许第 j+1 个人会跑掉. 留下的人为 dp[j-1] + dp[i-j]
//或dp[j] + dp[i-j-1]. 取其中小的一个。枚举 j 的位置 可得到 dp[i] 的最大值。

int n, m;

int a[505][505], dp[505], f[505];

void Dp() {
    int i, j, temp;
    dp[0] = 0;
    dp[1] = dp[2] = dp[3] = 1;
    for ( i = 4; i <= 500; ++i ) {
        dp[i] = 0;
        for ( j = 1; j < i; ++j ) {
            temp = min(dp[j-1]+dp[i-j], dp[j]+dp[i-j-1]);
            if ( temp > dp[i] )    dp[i] = temp;
        }
    }
}

int main()
{
    int i;
    while ( scanf("%d%d", &n, &m) != EOF ) {
        int s, e;
        Dp();
        memset(a, 0, sizeof(a));
        memset(f, 0, sizeof(f));
        for ( i = 0; i < m; ++i ) {
            scanf("%d%d", &s, &e);
            a[s][e] = a[e][s] = 1;
        }
        int res = 0, k = 0;
        for ( i = 0; i < n-1; ++i ) {
            if ( k == 0 && a[i][i+1] == 1 ) { k+=2;f[i]=f[i+1]=1; }
            else if ( a[i][i+1] == 1 )    { k++;f[i]=f[i+1]=1; }
            else {
                res += dp[k];
                k = 0;
            }
        }
        res += dp[k];
        for ( i = 0; i < n; ++i )
            if ( f[i] == 0 )    res++;
        printf("%d\n", res);
    }
    return 0;
}

如觉得还有问题 可参考其他相关文章
zoj3161 其他1
zoj3161 其他2
zoj3161 其他3
zoj3161 其他1

### 关于ZOJ 2193题目描述与解决方案 对于ZOJ 2193的具体题目描述未能直接从当前提供的参考资料中找到对应的信息。然而,在处理此类竞赛编程问题时,通常遵循一定的模式来解析和解决。 #### 动态规划的应用场景 当面对涉及序列优化的问题时,动态规划是一种常见的有效方法[^1]。虽然此原则适用于许多算法挑战,但对于特定编号为2193的ZOJ问题而言,具体的实现细节会有所不同。 #### 数据结构的选择 针对某些类型的查询操作频繁的数据集,采用合适的数据结构可以显著提高效率。例如,在处理区间更新或查询的情况下,线段树是一个强有力的选择[^4]。不过这取决于具体问题的需求,并不一定适合ZOJ 2193。 #### 数学模型构建的重要性 一些离散数学概念如组合计数、概率论以及特殊情况下像约瑟夫环这样的经典问题能够帮助建立有效的数学模型来进行求解[^2]。尽管这些技巧广泛应用于各类编程比赛中,它们是否能用于解答ZOJ 2193还需进一步确认该题目的具体内容。 为了获得关于ZOJ 2193更精确的帮助,建议访问原网站获取官方文档中的确切表述或者查阅其他参赛者分享的经验贴以了解可能存在的高效解法路径。 ```python # 此处提供一个通用框架作为参考而非特指ZOJ 2193的答案 def solve_problem(input_data): # 假设输入数据已经预处理完成并存储在input_data变量里 result = [] # 存储最终的结果列表 n = len(input_data) dp = [0]*n # 初始化dp数组用来记录状态转移过程中的最优子结构信息 for i in range(n): # 更新dp[i], 这里的逻辑应该基于实际问题定义而定 pass return result ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值