狂刷DP
不行啊都开始卷了,补一下弱项
P5020 货币系统
个人认为题面写复杂了,真没啥必要。。。
很明显的背包问题。
设 为面值为 的钱最多需要多少张货币来表示。
那么就直接跑背包就行了,表示不了的为 ,能表示的且只有它自己能的为 。
点击查看代码
#include<bits/stdc++.h> using namespace std; const int MAXN=3e4+5; const int INF=0x7f7f7f7f; inline int read() { int x=0,f=1;char ch=getchar(); while(!isdigit(ch)) { if(ch=='-') f=-1; ch=getchar(); } while(isdigit(ch)) { x=(x<<1)+(x<<3)+(ch^48); ch=getchar(); } return x*f; } int T,n; int a[5005],dp[MAXN];//dp[i]表示面值为i的钱最多要多少张货币来表示 int main() { T=read(); while(T--) { n=read(); for(int i=1;i<=n;i++) a[i]=read(); memset(dp,-INF,sizeof(dp)); dp[0]=0; for(int i=1;i<=n;i++) for(int j=a[i];j<=25000;j++) dp[j]=max(dp[j],dp[j-a[i]]+1); int ans=0; for(int i=1;i<=n;i++) if(dp[a[i]]==1) ans++; printf("%d\n",ans); } return 0; }
P4290 玩具取名
为什么感觉DP的题面都好难懂。。。
这道题大概就是给定一个变换规则,然后问哪一个字母可以经过瞎购吧变换变成题目给的名字。
这很明显区间DP吧。
设 表示 到 这一区间内的名字能否用字母 表示; 是对应字母的一个映射值。
然后就是常规区间DP三重循环。
但显然,我们在合并区间时还要判断两个区间的名字是否能进一步代替所需名字。
那么可以设 表示字母 和字母 能否代替字母
点击查看代码
本文作者:Code_AC
本文链接:https://www.cnblogs.com/code-ac/p/17496972.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步