zoukankan      html  css  js  c++  java
  • P1282 多米诺骨牌(01背包)

    链接

    最少的反转次数使的点数只差最小

    注意绝对值

    dp[i][j]表示前i个物品达到j,可以反转,也可以不转

    int g = a[i] - b[i];

    状态转移方程 dp[i][j] = min(dp[i - 1],[j - g + 5000],dp[j + g + 5000]+ 1);

    为什么要加5000呢?

    因为两个差值最大是5,n最大时1000;所以是5000

    然后从0开始枚举差值就可以了,找到的话输出最小的就可以了

    dp[maxn][10 * maxn]为什么时10,刚开始写的6,有的测试点没过,WA了

    #include <bits/stdc++.h>
    using namespace std;
    const int maxn = 1e3 +10;
    int dp[maxn][10 * maxn];//不要开小了,6 * maxn不对
    int a[maxn],b[maxn];
    int n;
    
    int main(){
        //freopen("in","r",stdin);
        ios::sync_with_stdio(0);
        cin >> n;
        for(int i = 1; i <= n; i++)
            cin >> a[i] >> b[i];
        memset(dp,0x3f, sizeof(dp));
        dp[1][a[1] - b[1] + 5000] = 0;
        dp[1][b[1] - a[1] + 5000] = 1;
        for(int i = 2; i <= n; i++){
            for(int j = - 5000; j <= 5000; j++){
                int g = a[i] - b[i];
                dp[i][j + 5000] = min(dp[i - 1][j - g + 5000],dp[i - 1][j + g + 5000] + 1);//不反转或者反转
            }
        }
    
        for(int i = 0; i <= 5000; i++){
            //从0开始枚举所有情况
            if(dp[n][5000 - i] <= 1000 || dp[n][5000 + i] <= 1000) {
                cout << min(dp[n][5000 - i],dp[n][5000 + i]) << endl;
                break;
            }
        }
        return 0;
    }
    View Code
  • 相关阅读:
    TypeScript-基础-09-声明文件
    TypeScript-基础-08-类型断言
    TypeScript-基础-07-函数的类型
    TypeScript-基础-06-数组的类型
    TypeScript-基础-05-对象的类型—接口
    TypeScript-基础-04-联合类型
    TypeScript-工程
    小白学前端03
    小白学前端02
    小白学前端
  • 原文地址:https://www.cnblogs.com/xcfxcf/p/12780616.html
Copyright © 2011-2022 走看看