
简单dp
syyyyyw
acmer一枚
展开
-
Codeforces Round #383 (Div. 1) B
就是01背包问题先用并查集再用01背包复杂度为nw代码如下#include#include#include#include#includeusing namespace std;const int maxn=1005;int dp[maxn],w[maxn],b[maxn],f[maxn];vectorgroup[maxn]; int Find(int x){原创 2017-08-05 19:35:38 · 192 阅读 · 0 评论 -
poj 3616
代码如下#include#include#include#includeusing namespace std;struct Node{ int s,e,sum;}a[1005];bool cmp(Node a,Node b){ if(a.s==b.s) return a.e<b.e; return a.s<b.s;}int mai原创 2018-01-26 09:07:24 · 113 阅读 · 0 评论 -
poj 2385
自己没有独立想出来,还是菜。。代码如下#include#include#include#includeusing namespace std;int main(){ int t,w; while(~scanf("%d%d",&t,&w)){ int a[1005],dp[1005][35]; for(int i=1;i<=t;i+原创 2018-01-25 18:57:43 · 130 阅读 · 0 评论 -
poj 2229
分两种情况当n为奇数,只能是1+偶数组成当n为偶数,有两种情况一种是1+奇数另一种是奇数*2;代码如下#include#include#include#includeusing namespace std;const long long Mod=1000000000;long long dp[1000005];int main(){ dp[0]=1;原创 2018-01-25 14:37:53 · 145 阅读 · 0 评论 -
poj 3176
代码如下#include#include#include#includeusing namespace std;int a[400][400];int dp[400][400];int main(){ int n; while(~scanf("%d",&n)){ for(int i=0;i<n;i++) for(int j原创 2018-01-25 13:50:56 · 122 阅读 · 0 评论 -
poj 1080
LCS的变形;这一次才充分理解LCS;dp[i+1][j+1]dp[i][j+1]代表i被使用同理代表j被使用代码如下#include#include#include#includeusing namespace std;int value[5][5]={ {5,-1,-2,-1,-3}, {-1,5,-3,-2,-4}, {-2,-3,5,-2,原创 2017-09-07 15:41:49 · 184 阅读 · 0 评论 -
poj 1159
一种解法是求原序和逆序的最长公共子序列;第二次方法是dp;都用的滚动数组,也可以用short减小内存;第一次知道怎么算内存大小了,哈哈//5000 * 5000的int ——> 5000 * 5000 * 4 bytes 约(/ (2 ^ 20))等于5 * 5 * 4 MB = 100 MB > 65536 K = 64 M,会MLE的。。第二种思路1.当S1原创 2017-09-07 12:31:29 · 368 阅读 · 0 评论 -
poj 1260
代码如下#include#include#include#includeusing namespace std;int main(){ int t; scanf("%d",&t); while(t--){ int c; int a[105],p[105],sum[105],dp[105]; memset(sum,0,sizeof(sum)); scanf("原创 2017-09-06 12:08:32 · 169 阅读 · 0 评论 -
poj 3176
数塔,代码如下#include#include#include#includeusing namespace std;int main(){ int n,a[355][355],dp[355][355]; scanf("%d",&n); for(int i=1;i<=n;i++) for(int j=1;j<=i;j++) scanf("%d",&a[i][j]);原创 2017-09-05 22:33:47 · 150 阅读 · 0 评论 -
poj 2253
代码如下#include#include#include#includeusing namespace std;int a[1005];int dp[1005];int los(int n){ for(int i=0;i<n;i++) dp[i]=10005; for(int i=0;i<n;i++) *lower_bound(dp,dp+n,a[i])=a[i];原创 2017-09-05 20:33:37 · 168 阅读 · 0 评论 -
poj 1836
求两遍LIS,枚举每个点代码如下#include#include#include#includeusing namespace std;int main(){ double h[1005],dp[1005]; int l[1005],r[1005]; int n; scanf("%d",&n); for(int i=0;i<n;i++) scanf("%lf",&原创 2017-08-26 09:54:46 · 240 阅读 · 0 评论 -
poj 3267
还是没能自己独立做出来,dp还需要练代码如下#include#include#include#includeusing namespace std;int main(){ char a[605][27]; char b[305]; int w,l; scanf("%d%d",&w,&l); scanf("%s",&b); for(int i=0;i<w;i++)原创 2017-08-26 08:18:57 · 218 阅读 · 0 评论 -
poj 1276
多重背包,转化成01背包,可以用二进制优化复杂度为O(V*∑log n[i]);#include#include#includeusing namespace std;int dp[110000],t[30000],s[2000][2];int main(){ int cash,n; while(scanf("%d%d",&cash,&n)>0) {原创 2017-08-25 20:51:43 · 166 阅读 · 0 评论 -
poj 1837
状态从-7500到7500 转到0-15000;状态转移方程为dp[i][j+w[i]*c[i]]=dp[i-1][j];代码如下:#include#include#include#includeusing namespace std;int main(){ int n,g; int c[21],w[21]; int dp[25][15005]; scanf("%d原创 2017-08-25 19:21:52 · 119 阅读 · 0 评论 -
hdu 5532 (最长上升子序列)nlogn
通过这一次,彻底的理解了最长上升子序列一开始我套程序设计竞赛的模板,就是不对又看了kuangbin的,别人博客的,最后真正理解了,花了3,4个小时,自己好菜啊不同的人有不同的写法分为上升,不递减两种程序设计竞赛的第一种int solve(int a[]){ for(int i=0;i<n;i++) dp[i]=INF; for(int i=0;i<n;i++)原创 2017-08-01 10:13:42 · 308 阅读 · 0 评论 -
poj 3280
lcs的变形代码如下#include#include#include#includeusing namespace std;int dp[2005][2005];char s[2005];int main(){ int n,m; while(~scanf("%d%d",&n,&m)){ int t[30]; scanf("%s原创 2018-01-26 10:25:38 · 104 阅读 · 0 评论