随笔分类 - 区间DP
摘要:多重背包..看代码吧还是orz#include using namespace std;#define LEN 7#define INIT 0xffffffffint F[60001];int max(int x, int y){ return x>y?x:y;}void ZeroOnePack(int cost, int weight, int V){ for (int v=V; v>=cost; --v) { F[v] = max(F[v], F[v-cost]+weight); }}void CompletePack(int cost, int weigh...
阅读全文
摘要:设 d[ i ][ j ] 表示走到坐标为(i, j)的格子时最大的幸运值。初始化:dp[i][j]的第0行和第0列初始化为负的无穷大。。、#include #include #include using namespace std;int map[25][1005],dp[25][1005];int main(){ int t,n,m,i,j,k; scanf("%d",&t); while(t--) { scanf("%d%d",&n,&m); for(i = 1; i<=n; i++) for(j = 1; j<
阅读全文
摘要:最长上升子序列裸题在网上看到有两种方法...一种复杂度O(N^2),一种O(NlogN)。orzO(N^2):#include#define N 1001int main(){ int n,ans; int a[N],d[N]; while(~scanf("%d",&n)){ for(int i=1; ia[j] && d[i]ans) ans=d[i]; } printf("%d\n",ans); } return 0;}View CodeO(NlogN): #include using namespace s...
阅读全文
摘要:就是找两个字符串的最长公共子序列的长度#include#includeconst int Max=1000;int res[Max][Max];using namespace std;int main(){ string str1,str2; int len1,len2; while(cin>>str1) { cin >> str2; int i,j; memset(res,0,sizeof(res)); len1=str1.length(); len2=str2.length(); f...
阅读全文
摘要:求猜存钱罐中至少有多少钱。容易知道金币总的重量,接着背包。#include#includeusing namespace std;#define N 10010#define M 100000000int dp[N];int val[501],we[501];int main(){ int t; scanf("%d",&t); while(t--) { int em,fu; scanf("%d%d",&em,&fu); int n; scanf("%d",&n); for(int i=0; i<n
阅读全文
摘要:背包问题,在定容量的背包中放入物体求装满价值最大。因为每种物体数量只有1,故只有放与不放。#include#include#includeusing namespace std;#define N 3410#define M 13000int dp[M];int main(){ int n,m; int val[M],w[N]; while(~scanf("%d%d",&n,&m)) { memset(dp,0,sizeof(dp)); for(int i=1;i=w[i];j--) { d...
阅读全文
摘要:简单DP三角形左右取最大值就好,然后计算到最后一行时再取最大值。#include#includeusing namespace std;int main(){ int a[101][101],n,i,j; while(scanf("%d",&n)!=-1) { for(i=1;ia[i-1][j]? a[i-1][j-1]:a[i-1][j]); } a[i][i] += a[i-1][j-1]; } int mmax=a[n][1]; for(i=1;immax) mmax=...
阅读全文

浙公网安备 33010602011771号