摘要:经典状态dp状态复用了代码:#include<iostream>#include<fstream>#include<cmath>using namespace std;int n,m;long long dp[12][2048];int ok(int s){ int i,j,k; for(i=0;i<m;) { j=s&(1<<i); if(j>0) { if(i+1>=m) return 0; if((s&(1<<(1+i)))==0) return 0; i+=2; } else i++; } r
阅读全文
摘要:dfs代码:#include<iostream>#include<fstream>using namespace std;int n;struct e{ int x1,y1,x2,y2,c;};e a[16];struct ee{ int data; ee *next;};ee edge[16];int ans;int d[16];int v[16];void solve(int num,int value,int color){ int i,j,k; if(value>ans) return; if(num==n) { ans=value; return; }
阅读全文
摘要:经典状态dp代码:#include<iostream>#include<fstream>#include<cmath>using namespace std;int n,m;char map[101][11];int state[101][1024];int num[101];int value[1024];int maxx;int ok(int s,int t){ int i,j,k; for(i=0;i<m;) { j=t&(1<<i); if(j) { if(map[s][i+1]=='H') return 0
阅读全文
摘要:题目大意: 农夫FJ想把他所有的牛在它们吃草的时候用一根绳子连起来(就是1-2-3-1按顺序连接起来),每头牛有若干个吃草的位置,它们必须要在这些位置吃草。用绳子连接两头牛需要绳子的长度公式为 Sqrt( Sqr( x1-x2 ) + Sqr( y1-y2 ) ) ,农夫FJ希望需要的那根绳子长度最短,他需要你帮他求出这个最短的长度是多少。代码:#include<iostream>#include<fstream>#include<cmath>using namespace std;int n;int num[101];double x[101][41];d
阅读全文
摘要:水题代码:#include<iostream>#include<fstream>using namespace std;long long n;long long a[10001];int cmp(const void *a,const void *b){ return *(long long*)a-*(long long *)b;}void read(){// ifstream cin("in.txt"); long long i,j,k; cin>>n; for(i=1;i<=n;i++) cin>>a[i]; lo
阅读全文
摘要:题意:已知有n(n<30)种类型的block,以及它们的长宽高,每种类型的block都有无限多个。问如果把他们叠起来(上面block的底面的长宽,必须比下面的block的底面长宽都短),最高能有多高。代码:#include<iostream>#include<fstream>using namespace std;int n;struct e{ int s,t,h;};e a[100];int cmp(const void *a,const void *b){ return (*(e *)a).s-(*(e *)b).s;}int dp[101];void rea
阅读全文
摘要:水题,定义好状态代码:#include<iostream>#include<fstream>using namespace std;char c1[110],c2[110];int dp[110][110];void print(int s,int t){ int i,j,k; if(s==0&&t==0) return; if(s==0) { for(i=0;i<t;i++) cout<<c2[i]; return; } if(t==0) { for(i=0;i<s;i++) cout<<c1[i]; return;
阅读全文
摘要:dp代码:#include<iostream>#include<fstream>using namespace std;int n;int l[50003],r[50003];int a[50003];void read(){// ifstream cin("in.txt"); int i,j,k; scanf("%d",&k); while(k--) { scanf("%d",&n); for(i=1;i<=n;i++) { scanf("%d",&a[i])
阅读全文
摘要:dp代码:#include<iostream>#include<fstream>using namespace std;double dp[111][111];int mark[101];int l,b;int n,m;int ok(int s,int t){ int i,j,k; k=s+t; while(1) { if(k>n) k=2*n-k; else if(k<0) k=-k; else break; } if(mark[k]==2) k=0; return k;}void read(){// ifstream cin("in.txt&q
阅读全文
摘要:转移的时候,就是:dp[i][j] = min{dp[i - 1][0...j] + abs(A[i] - T[j])},其中A[i]是第i个数的原始值,T[j]是j离散化前的值。代码:#include<iostream>#include<fstream>using namespace std;int n;long long a[2001];long long b[2001];int cmp(const void *a,const void *b){ return *(long long*)a-*(long long*)b;}long long dp[2001][20
阅读全文
摘要:有意思的树形dp代码:#include<iostream>#include<fstream>using namespace std;int n;struct e{ int data; e *next;};e edge[10001];int dp[10001][3];int v[10001];void solve(int s){ int i,j,k; v[s]=1; e *p=edge[s].next; dp[s][1]=1; dp[s][0]=0; dp[s][2]=10000000; if(!p) return; k=-1000000; int f=0; dp[s][
阅读全文
摘要:简单题代码:#include<iostream>#include<fstream>#include<vector>using namespace std;vector<long long> edge[100001];long long value[100001];int v[100001];long long dp[100001];long long n,m;long long ok(long long s){ if(s<0) return -s; return s;}long long solve(long long s){ long l
阅读全文
摘要:树形dp大意:某电台要广播一场比赛,该电台网络是由N个网点组成的一棵树,其中M个点为客户端,其余点为转发站。客户端i愿支付的钱为pay[i],每一条边需要的花费固定,问电台在保证不亏损的情况下,最多能使多少个客户端接收到信息?广播台所在的节点编号为1分析:树形DP1.user[i].dp[j]表示从转发站i开始计算,满足其子树中j个顾客的最大报酬 分析节点i的孩子节点s a.放弃该孩子s,值不变 b.取该孩子的若干的节点:user[i].dp[j-k]+user[s].dp[k]-cost[i][j](cost[i][j])为 连通该边所需要付出的代价。 综上: user[i].dp[j]=m
阅读全文
摘要:经典题,注意输出代码:#include<iostream>#include<fstream>using namespace std;long long a[5843];long long min(long long s,long long t){ if(s<t) return s; return t;}void read(){// ifstream cin("in.txt"); int i,j,k; int n1,n2,n3,n4; n1=1;n2=1;n3=1;n4=1; a[1]=1; for(i=2;i<=5842;i++) { a
阅读全文
摘要:简答dp代码:#include<iostream>#include<fstream>using namespace std;char a[201],b[201],c[401];bool dp[201][401];void read(){// ifstream cin("in.txt"); int i,j,k; int cas; cin>>cas; for(k=1;k<=cas;k++) { cin>>a>>b>>c; int n1=strlen(a); int n2=strlen(b); mems
阅读全文
摘要:上下文无关文法。经典。代码:#include<iostream>#include<fstream>using namespace std;char c[300];int map[201][201][4];int Set(int ,int);int ElemList (int,int);int List(int,int);int Elem(int,int);int Atom(int,int);int Atom(int s,int t){ if(s==t) return 1; return 0;}int Elem(int s,int t){ if(map[s][t][3]&
阅读全文
摘要:dp水题代码:#include<iostream>#include<fstream>using namespace std;int dp[501][501];int a[501][501];int b[501][501];int n,m;void read(){// ifstream cin("in.txt"); int i,j,k; while(cin>>n>>m){ if(n==0) return; for(i=1;i<=n;i++) for(j=1;j<=m;j++) scanf("%d"
阅读全文
摘要:经典dp。代码:#include<iostream>#include<fstream>using namespace std;int a[1010];int dp[1010][1010][2];int v[1010][1010][2];int cmp(const void *a,const void *b){ return *(int*)a-*(int*)b;}int n,m;int solve(int s,int t,int f){ int i,j,k; if(v[s][t][f]) return dp[s][t][f]; v[s][t][f]=1; if(f==0)
阅读全文
摘要:第一类斯特灵数S(n,m)就是把n元集合分成m部的个数,有递推关系S(n,m)=S(n-1,m-1)+mS(n-1,m).所求还要全排列一下.再乘以m!就可以了累加1~B个数全部用上,就是结果.F(B)=sum(C(B,i)*(Sum(Stir( i,j )* j ! ) ) )就是结果.代码:#include<iostream>#include<fstream>#include<cmath>using namespace std;long long dp[13][13];long long ans[13];long long fun(long long s
阅读全文
摘要:dp代码:#include<iostream>#include<fstream>using namespace std;int l,n,b;struct e{ int w,x,f,c;};e a[10001];int dp[1001][1001];int cmp(const void *a,const void *b){ e *s=(e *)a; e *t=(e *)b; return s->x-t->x;}void read(){// ifstream cin("in.txt"); int i,j,k; cin>>l>
阅读全文