hihoCoder 1251 Today Is a Rainy Day(暴力)

223 篇文章 1 订阅
14 篇文章 0 订阅

题目连接:hihoCoder 1251 Today Is a Rainy Day

解题思路

用一个6位6进制表示每个数对应的转换,用广搜预处理代价。

代码

#include <cstdio>
#include <cstring>
#include <queue>
#include <algorithm>

using namespace std;
const int maxn = 50005;
const int inf = 0x3f3f3f3f;

int dp[maxn];

int idx(int* c) {
    int ret = 0;
    for (int i = 0; i < 6; i++)
        ret = ret * 6 + c[i];
    return ret;
}

void ridx(int s, int* c) {
    for (int i = 5; i >= 0; i--) {
        c[i] = s % 6;
        s /= 6;
    }
}

void presolve() {

    int c[10], t[10];
    for (int i = 0; i < 6; i++) c[i] = i;
    int s = idx(c);

    memset(dp, inf, sizeof(dp));
    dp[s] = 0;

    queue<int> que;
    que.push(s);

    while (!que.empty()) {
        s = que.front();
        que.pop();

        ridx(s, c);
        for (int i = 0; i < 6; i++) {
            for (int j = 0; j < 6; j++) {
                memcpy(t, c, sizeof(t));
                for (int k = 0; k < 6; k++) if (t[k] == i) t[k] = j;
                int v = idx(t);
                if (dp[v] > dp[s] + 1) {
                    dp[v] = dp[s] + 1;
                    que.push(v);
                }
            }
        }
    }
}

int G[10][10], C[10];
char a[200], b[200];

int main () {
    presolve();
    while (scanf("%s%s", a, b) == 2) {
        memset(G, 0, sizeof(G));
        memset(C, 0, sizeof(C));

        int n = strlen(a);
        for (int i = 0; i < n; i++) {
            int u = b[i] - '1', v = a[i] - '1';
            C[u]++;
            G[u][v]++;
        }

        int ans = inf, t[10];
        for (int s = 0; s < maxn; s++) {
            ridx(s, t);
            int tmp = dp[s];
            for (int i = 0; i < 6; i++)
                tmp += C[i] - G[i][t[i]];
            ans = min(ans, tmp);
        }
        printf("%d\n", ans);
    }
    return 0;
}
"CCO2022 day1"中的Rainy Markets问题通常涉及到数组操作和动态规划的思想。在C++中,这个问题描述的是在一个交易市场里,每天都有降雨概率,如果当天下雨,股票价格就会下跌;反之则上涨。你需要确定一个策略来购买和出售股票,以最大化收益。 一个基本的解题思路可能是: 1. **读取输入**:首先需要读取每一天的天气情况(降雨概率)以及初始买入价。 2. **状态定义**:设置一个二维动态规划数组dp[i][j],其中i表示天数,j表示剩余的未卖出的股票数。dp[i][j]表示前i天持有j股的最大收益。 3. **状态转移**:对于每一天,有两种选择:卖出所有股票(转移到下一个状态0),或保留股票到第二天(根据天气情况更新股票价值并转移到下一天的相应状态)。 4. **边界条件**:初始化dp[0][0]为0,因为没有股票时收益为0。 5. **计算最大收益**:遍历所有状态,找到dp[n][0]作为最终结果,n为总天数。 6. **代码实现**:使用C++的数据结构(如vector)来存储状态,并利用迭代或递归的方式进行状态转移。 ```cpp #include <vector> using namespace std; int maxProfit(vector<int>& prices, int numRains) { int n = prices.size(); vector<vector<int>> dp(n + 1, vector<int>(numRains + 1, -INT_MAX)); dp[0][0] = 0; for (int i = 1; i <= n; ++i) { for (int j = 0; j <= numRains; ++j) { if (prices[i - 1] > prices[i - 1 - j]) { // 雨天,卖出手里的股票 dp[i][j] = max(dp[i][j], dp[i - 1][j + 1] + prices[i - 1]); } else { // 晴天,保留股票 dp[i][j] = max(dp[i][j], dp[i - 1][j]); } } } return dp[n][0]; } // 示例 vector<int> prices = {2, 4, 1}; // 例如有3天,价格分别为2, 4, 1 int rains = 1; // 降雨概率为1天 int result = maxProfit(prices, rains); ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值