摘要: 思路:若没有边权,则对点权从大到小排序即可,考虑边,将边权拆成两半加到它所关联的两个点的点权中即可,因为当两个人分别选择不同的点时,这一权值将互相抵消。#include#include#include#includeusing namespace std;double val[100010];int cmp(double a,double b){ return a>b;}int main(){ int n,i,m,j,a,b; double c; while(scanf("%d%d",&n,&m)!=EOF) { for(i=1;i<=n;i++ 阅读全文
posted @ 2013-08-06 21:49 fangguo 阅读(136) 评论(0) 推荐(0) 编辑
摘要: 思路:定义一个三维数组dp[x][i][j]其中x为now和pre两种状态,now表示当前两行最优解,pre表示出了本行外,前两行的最优解。那么状态转移方程为dp[now][j][k]=max(dp[now][j][k],dp[pre][k][r]+num[i][j][1])。num[i][j][1]表示第i行的第j个状态的1的个数。转移条件是!(num[i][j][0]&num[i-1][k][0])&&!(num[i][j][0]&num[i-2][r][0])&&!(num[i-1][k][0]&num[i-2][r][0])为真。 阅读全文
posted @ 2013-08-06 17:59 fangguo 阅读(129) 评论(0) 推荐(0) 编辑
摘要: 思路:将每一行看做一个二进制位,那么所有的合法状态为相邻为1的个数一定要为偶数个。这样就可以先把所有的合法状态找到。由于没一层的合法状态都是一样的,那么可以用一个数组保存。由第i-1行到第i行的状态转移是dp[i][now|num[j]]+=dp[i-1][k],其中now为(1#include#include#include#define Maxn 13#define inf 0x7fffffffusing namespace std;__int64 dp[Maxn][1=1;i--) sum+=graphic[i]*(1<<(m-i)); num[++c... 阅读全文
posted @ 2013-08-06 14:28 fangguo 阅读(143) 评论(0) 推荐(0) 编辑
摘要: 思路:把每行的数当做是一个二进制串,0不变,1变或不变,找出所有的合法二进制形式表示的整数,即相邻不同为1,那么第i-1行与第i行的状态转移方程为dp[i][j]+=dp[i-1][k];这个方程得前提条件是num[i][j]&num[i-1][k]==0,也就是他们表示的二进制形式相与为0,那么就不存在相邻为1的情况。#include#include#include#include#define Maxn 13#define inf 0x7fffffffusing namespace std;__int64 dp[Maxn][1=1;i--) sum+=graphic[... 阅读全文
posted @ 2013-08-06 10:45 fangguo 阅读(148) 评论(0) 推荐(0) 编辑