【Coder Force】264C - Choosing Balls (DP高难度思维转换)

22 篇文章 0 订阅
9 篇文章 0 订阅

卡了2天,说多了都是泪。

/*
该点的最大值的可以由前面某个点加上相应的值得到。
而前面的点可以分析为以下的条件
1、前面的这个点与该点颜色相同。
2、这个点与这个点颜色不同。
3、前面没有点。
现在分析:
由于1、3两个条件已经是o(1)的时间,所以不需要优化。
主要的时间出在于2的时间,2需要遍历。
假设2里面有n个条件需要判断,其实归结起来,我们只需要判断两个情况
1、这个点的颜色与该点相同
2、这个点的颜色与该点不同。
而且假如不同的话,加上的差值都是一样的,所以我们应该选择一个积累了最大的与该点颜色不同的点加上该差值,那么这个点的值就是达到最大。
这个是由于a,b两个量决定的,所以我们应该在该点当中选择一个最大的即可。
所以优化的方法便是保留两个值,一个是最大,一个是最小。这样就能够保证取到一种颜色不同的最大值
假如保留一个的话可能会有一种情况,即该点的颜色与最大的颜色相同,这样的话便少考虑了一种情况,显然这是不可行的。
dp[i]表示的是i颜色迄今为止所能够达到的最大的值
关于dp的状态量表示的想法:dp[i],对于i的选取一般都选择位置,
但是对于数据量大的时候,我们不妨考虑已知的其他量,然后去推相应的状态方程,假如不行的话,再想相应的优化方法,不失为一个好的决策。
在考虑一点如何转换的时候,不妨考虑该点的转换方向
*/
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
long long dp[100005];
int c[100005];
long long v[100005];
int id1, id2;
const long long inf = 0x7ffffffffffffff;
int main()
{
    int n, m;
    while (cin >> n >> m)
    {
        for (int i = 1; i <= n; i++)
            cin >> v[i];
        for (int i = 1; i <= n; i++)
            scanf("%d", &c[i]);
        long long a, b;
        for (int i = 0; i < m; i++)
        {
            long long sum=0, ans;
            cin >> a >> b;
            id1 = 0;
            id2 = 0;
            for (int j = 0; j <= n; j++)
                dp[j] = -inf;
            for (int j = 1; j <= n; j++)
            {
                int cc = c[j];
                ans = max(dp[cc]+a*v[j],b*v[j]);
                if (cc != id1)
                    ans = max(ans, dp[id1] + b*v[j]);
                else
                    ans = max(ans, dp[id2] + b*v[j]);
                if (ans > dp[id1])
                {
                    if (id1 != cc)
                    {
                        id2 = id1;
                        id1 = cc;
                    }
                    else
                        id1 = cc;
                }
                else
                if (ans > dp[id2] && cc != id1)
                    id2 = cc;
                dp[cc] = max(dp[cc],ans);
                sum = max(ans, sum);

            }
            cout << sum << endl;
        }
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
HDL Coder是一个Matlab工具箱,可以将Matlab代码转换为Verilog或VHDL代码,以便在FPGA或ASIC上实现。在本教程中,我们将介绍如何使用HDL Coder将Verilog代码转换为Matlab可调用的模块。 步骤1:创建Verilog代码 首先,创建一个简单的Verilog模块,例如一个加法器。以下是一个简单的Verilog代码示例: ``` module adder(a, b, c); input [7:0] a; input [7:0] b; output [7:0] c; assign c = a + b; endmodule ``` 此代码创建一个8位加法器,将两个8位输入相加,并将结果输出到8位输出端口c中。 步骤2:使用HDL Coder生成Matlab函数 现在,我们将使用HDL Coder将Verilog代码转换为Matlab可调用的模块。打开Matlab并创建一个新的脚本。在脚本中,将以下代码输入到控制台中: ``` coder -hdlcoder -int -input -args {fi(0,1,8),fi(0,1,8)} -top adder adder.v ``` 此命令告诉HDL Coder将adder.v文件转换为Matlab函数,并将其命名为adder。参数fi(0,1,8)指定每个输入和输出的数据类型和位宽。在本例中,我们使用8位有符号定点数。 执行此命令后,HDL Coder将生成两个文件:adder.m和hdl_prj/hdlsrc/adder.vhd。adder.m包含Matlab函数,可以调用Verilog模块。hdl_prj/hdlsrc/adder.vhd是HDL Coder生成的VHDL代码。 步骤3:测试生成的Matlab函数 现在,我们将测试生成的Matlab函数,以确保它可以正确调用Verilog模块。在Matlab命令行中,输入以下代码: ``` a = fi(5,1,8); b = fi(10,1,8); c = adder(a, b); ``` 此代码将创建两个8位有符号定点数,将它们作为输入传递给adder函数,并将结果保存在c中。执行此代码后,c应该等于15。 总结 使用HDL Coder将Verilog代码转换为Matlab可调用的模块非常简单。只需要几个简单的步骤,就可以将Verilog代码转换为Matlab函数,并在Matlab中测试它们。通过使用HDL Coder,您可以轻松地将Matlab算法转换为可在FPGA或ASIC上实现的硬件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值