题解 P1846 【游戏】

· · 题解

前言

思路

代码

//P1846 游戏
//submit 1
//By sxt on 2020.5.23
#include<bits/stdc++.h>

#define rg register int
#define il inline
#define in read()
#define _num(x) (x >= '0' && x <= '9')
#define ql(x) memset(x, 0, sizeof(x)) 
#define mid (l+r>>1)
#define min(x, y) (x<y?x:y)
#define Min(x, y, z) min(x, min(y, z))

using namespace std;

const int N = 2007; 

il int read(){
    int x=0,f=1;
    char ch=getchar();
    while(!_num(ch)){
        if(ch=='-')
            f=-1;
        ch=getchar();
    }
    while(_num(ch)){
        x=x*10+ch-'0';
        ch=getchar();
    }
    return x*f;
}

char f[10];
int pcnt;

il void pint(int x){
    pcnt = 0;
    if(x == 0) putchar('0');
    while(x){
        f[++pcnt] = x % 10 + '0';
        x /= 10;
    }
    while(pcnt) putchar(f[pcnt--]);
    putchar('\n');
}

int b[N], a[N], dp[N][N], n, m;

signed main()
{
    n = in, m = in;
    for(rg i = 1; i <= n; ++ i)a[i] = in, --a[i];
    for(rg i = 1; i <= m; ++ i)b[i] = in, --b[i];
    memset(dp, 0x3f3f3f, sizeof(dp));
    dp[0][0] = 0;
    for(rg i = 1; i <= n; ++ i)for(rg j = 1; j <= m; ++ j)
        dp[i][j] = Min(dp[i-1][j-1], dp[i-1][j], dp[i][j-1]) + a[i] * b[j];
    pint(dp[n][m]);
    return 0;
}

The · End.