2024.9.18

今日总结:
1:订货
这道题是一道dp题,主要是用费用流
dp[i][j]表示前i个月过完仓库里还剩j个产品时所需要的最小的费用

dp[i][j]=min(dp[i][j],dp[i-1][k]+j×m+(j+u[i]-k)×d[i]);
dp[i][j]=min(dp[i][j],dp[i-1][k]-k×d[i]);
dp[i][j]+=j×m+(j+u[i])×d[i];
点击查看代码
#include<bits/stdc++.h>

using namespace std;

const int INF = 0x3f3f3f3f;
const int N = 1e5 + 10;

int n,m,s,u[N],d[N];
int dp[725][N];

int main()
{
    scanf("%d %d %d",&n,&m,&s);
    for(int i = 1;i <= n;i ++)
        scanf("%d",&u[i]);
    for(int i = 1;i <= n;i ++)
        scanf("%d",&d[i]);
    for(int i = 0;i <= s;i ++)
        for(int j = 0;j <= n;j ++)
            dp[j][i] = INF;
    dp[0][0] = 0;
    for(int i = 1;i <= n;i ++)
    {
        for(int k = 0;k <= u[i] && k <= s;k ++)
            dp[i][0] = min(dp[i][0],dp[i - 1][k] - k * d[i]);
        for(int j = 1;j <= s;j ++)
            if(j + u[i] <= s)
                dp[i][j] = min(dp[i][j - 1],dp[i - 1][j + u[i]] - (j + u[i]) * d[i]);
            else 
                dp[i][j] = dp[i][j - 1];
        for(int j = 0;j <= s;j ++)
            dp[i][j] += j * m + (j + u[i]) * d[i];    
    }
    printf("%d\n",dp[n][0]);
    return 0;
}

2:向量
这道题是一道数学题主要用到了裴蜀定理


点击查看代码
#include<bits/stdc++.h>

using namespace std;

typedef long long ll;

int T;
ll a,b,x,y;

ll gcd(ll x,ll y)
{
	return y ? gcd(y,x % y) : x;
}

bool P(ll x,ll y,ll c)
{
	return !(c % gcd(x,y));
}

int main()
{
	scanf("%d",&T);
	while(T --)
    {
        scanf("%lld %lld %lld %lld",&a,&b,&x,&y);
        printf("%c\n",((P(2 * a,2 * b,x) && P(2 * a,2 * b,y)) || (P(2 * a,2 * b,x + a) && P(2 * a,2 * b,y + b)) || (P(2 * a,2 * b,x + b) && P(2 * a,2 * b,y + a)) || (P(2 * a,2 * b,x + a + b) && P(2 * a,2 * b,y + a + b))) ? 'Y' : 'N');
    }
	return 0;
}

3:计数
按照一般数位DP的做法,在DFS的过程中枚举每个位置上填什么并记忆化搜索
num[i]表示数字i还剩num[i]个
dp[pos][flag]表示第pos位是否有上界

点击查看代码
#include<bits/stdc++.h>

using namespace std;

typedef long long ll;
const int N = 75;

int len;
int a[N],b[N],num[N];
string t;
vector<int> q;
map<vector<int>,ll> dp[N][10];
map<vector<int>,bool> mp[N][10];

inline ll dfs(int pos,bool flag)
{
    if(pos > len) return 1;
    if(mp[pos][flag][q]) return dp[pos][flag][q];
    int Max = flag ? a[pos] : 9;
    ll res = 0;
    for(int i = 0;i <= Max;i ++)
    {
        int cnt = q[i];
        if(cnt >= num[i]) continue;
        q[i] ++;
        res += dfs(pos + 1,flag && i == Max);
        q[i] --;
    }
    mp[pos][flag][q] = 1;
    return dp[pos][flag][q] = res;
}

int main()
{
    cin >> t;
    len = t.length();
    for(int i = 0;i < len;i ++)
    {
        a[i + 1] = t[i] - '0';
        num[a[i + 1]] ++;
    }
    for(int i = 0;i <= 9;i ++)
        q.push_back(0);
    printf("%lld\n",dfs(1,1) - 1);
    return 0;
}
posted @ 2024-09-18 21:53  Kevinhwbb  阅读(7)  评论(0编辑  收藏  举报