3.31刷题日记

买不到的数目

结论: 如果 a,b 均是正整数且互质,那么由
ax + by, x ≥ 0, y ≥ 0 不能凑出的最大数是 ab − a − b

我用队列果然超时了,以后这种题如果这样都超时了,可以考虑找规律了

找规律的方法:例 3 1 -> ? 3 2 -> ? 3 3 -> ? 3 4 -> ?

带证明的相似题

蚂蚁感冒

又是做过的题不会做

关键点:将碰到对方看作是穿过对方,或者说是灵魂互换

pair<int, int> p[55];

int main() {
	IOS;
	// freopen("P1908_6.in","r",stdin);//读入数据
	// freopen("P1908.out","w",stdout); //输出数据
    int n;
    cin >> n;
    int start;
    for (int i = 0; i < n; ++i){
        int temp;
        cin >> temp;
        if(temp < 0)
            p[i] = {abs(temp), -1};
        else
            p[i] = {temp, 1};
    }
    int i;
    int l = 0, r = 0;
    int ans = 1;
    if(p[0].second > 0) {
        for (int i = 1; i < n; ++i){
            if(p[i].first < p[0].first) {
                if(p[i].second > 0)
                    ++l;
            }
            else if(p[i].first > p[0].first) {
                if(p[i].second < 0)
                    ++r;
            }
        }
         if(r != 0) 
            ans += l + r;
    }
    else {
        for (int i = 1; i < n; ++i){
            if(p[i].first < p[0].first) {
                if(p[i].second > 0)
                    ++l;
            }
            else if(p[i].first > p[0].first){
                if(p[i].second < 0)
                    ++r;
            }
        }
        if(l != 0)
            ans += l + r;
    }
    cout << ans;
    return 0;
}

地宫取宝

还是没咋懂实现过程
在这里插入图片描述

int g[55][55];
int f[55][55][13][14];

int main() {
	IOS;
	// freopen("P1908_6.in","r",stdin);//读入数据
	// freopen("P1908.out","w",stdout); //输出数据
    int n, m, k;
    cin >> n >> m >> k;
    for (int i = 1; i <= n; ++i){
        for (int j = 1; j <= m; ++j){
            cin >> g[i][j];
            ++g[i][j];
        }
    }

    f[1][1][1][g[1][1]] = 1;
    f[1][1][0][0] = 1;

    for (int i = 1; i <= n; ++i){
        for (int j = 1; j <= m; ++j){
            if(i == 1 && j == 1)
                continue;
//四维状态再循环一个决策
            for (int a = 0; a <= k; ++a){//个数
                for (int b = 0; b <= 13; ++b){//最后一个数的价值
                    int &val = f[i][j][a][b];
                    val = (val + f[i - 1][j][a][b]) % mod;
                    val = (val + f[i][j - 1][a][b]) % mod;
                    if(a > 0 && b == g[i][j])//因为取到当前数了
                        for (int c = 0; c < b; ++c){//相当于c'
                            val = (val + f[i - 1][j][a - 1][c]) % mod;//取之前的数量
                            val = (val + f[i][j - 1][a - 1][c]) % mod;
                        }
                }
            }
        }
    }
    int ans = 0;
    for (int i = 0; i <= 13; ++i)
        ans = (ans + f[n][m][k][i]) % mod;
    cout << ans;
    return 0;
}

关键是dp的分析方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值