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;
}