摘要:
题意:给出一个n*m的棋盘,其中某些格子已被染色,现在要对剩余格子黑白染色,且满足:1、黑白格子分别连通;2、不存在2*2的单色正方形;求方案数和任意一种方案;以黑色为例转移如下:If 左黑 && 上黑 Then 合并两个连通块Else If 左白 && 上白 Then 形成新的连通块Else If 左黑 && 上白 Then 和左边的合并Else If 左白 && 上黑 Then 和上边的合并If 左黑 && 上黑 && 左上黑 Then 形成2x2的格子,非法If 最后一格 && 阅读全文
摘要:
题意:用1*2的矩形,覆盖m*n的大矩形,问有多少种情况。long long dp[30][1<<12],b[30][1<<12],width,height; //用int出错long long solve(int i,int j,int pos,int state){ //第i行初始状态为j if(b[i][state])return dp[i][state]; if(pos==width){ if(i<=height){ int s=~j&((1<<width)-1); dp[i][state]+=solve(... 阅读全文
摘要:
题意:给一棵树,以及边上的权值,求每个结点到其它结点的最大权值分析:两次DFS第一次由底向上确定每个结点到叶子结点的最大权值第二次由上到下确定每个结点经过父结点的最大权值,并确定最终答案const int MaxN=10005;int a[MaxN][300], v[MaxN][300], p[MaxN];int succ[MaxN], pred[MaxN], ans[MaxN];int dfs1(int x){ if(p[x]){ FOR(i, 0, p[x]) { int temp = v[x][i] + dfs1(a[x][i]); ... 阅读全文
摘要:
题意:求最长的子序列 使 m <= 最大值-最小值 <= k分析:两个单调队列,一增一减,当 max-min>k 时,队首元素出队,当 max-min<m 时,不必出队,因为后来加入的元素可能使差值变大,但不可能使差值变小const int maxn=100005;int mi,ma;struct que{ int ans,pre; int a[maxn], pa[maxn], la, ra; int b[maxn], pb[maxn], lb, rb; void init(){ la=lb=1; ra=rb=0; pre=0; ans=0;} void ins(... 阅读全文
摘要:
题意:给定每天的股票买进上限,买进价格,卖出上限,卖出价格,每两次买卖操作中间必须间隔w天,每天最多持有maxp个股票,问n天后最大收益是多少分析:dp[i][j]表示第i天有j个股票的最大收益令 pre = i-w-1dp[i][j]=max dp[i-1][j] //不买不卖 dp[pre][k] - (j-k)*buy[i] //买j-k个 dp[pre][k] + (k-j)*sell[i] //卖k-j个即 dp[i][j] + j*buy[i] = max ( dp[pre][k] + k*buy[i] ) ( j-k <= buyn ) dp[i][j] ... 阅读全文
摘要:
fzu 1977 格子分三种:不能走,可走可不走,一定要走。求单回路条数。如果左上插头都为0 并且此格子可以不走 直接将状态加入到hash表中。记录最后一个必须走的格子 此后如果有回路形成 加入到结果。有回路形成 left=1 up=2 并且其它位置要全为0 为此WA了一晚上。。另外 若plugDP最后return dp[0] 测试数据又无解 应写成if(src->sz==0) return 0; return src->dp[0]-2;int M[15];const int HSize = 12397;int n , m , nn , mm ;int maze[15][15];i 阅读全文
摘要:
题意:给出n(n<=200)块黄铜合金,每块具有铜含量和价钱。给出C个询问 , 形如: 在n块中取 M 块 使得这M块合金的铜含量在[cMin * M, cMax * M]这个区间所花费的最少价钱。分析:0/1背包 f[k][j] 表示选k块合金得到含量j的最小开销。f[k,j] = min f[k-1, j-v[i] ) + pri[i] , 有多个询问,但合金不变,所以预处理出所有情况。const int M=201;int n, m, v[M], w[M];int num, cmin, cmax;int f[21][20005];int main(){ scanf("%d 阅读全文
摘要:
题意:给定6种币值,使用尽量少的硬币,组成1 2 3 4……100,问平均要多少个,以及最多要多少个?分析:完全背包const int M = 1200;int a[7],f[M],tot,ma;void dp(int s){ memset(f,1,sizeof(f)); f[0] = tot = ma = 0; FOE(i, 1, 6) FOE(j, a[i], M) checkmin(f[j], f[ j-a[i] ]+1);//付j FOE(i, 1, 100){ FOE(j, 0, M-i) checkmin(f[i], f[j+i]+f[j]);... 阅读全文
摘要:
题意:黑书P117 决斗 分析:假设需要判断x是否能赢得整场战斗,把环看成链,x点拆成两个,那么编号为x的人能从中胜出的充分必要条件是他能与自己“相遇”。这样,在连续几个人的链中,只须考虑头尾两个人能否胜利会师,中间的则不予考虑。设meet[i][j]记录i和j能相遇,能则为true,否则为false,则问题转化为了是否能找到一个k,使得i 和 k, k和j均能相遇,而 i或j能打败k。const int M = 202;int n;int a[M][M], meet[M][M];void readData(){ cin>>n; char c; FOE(i, 1, n){ ... 阅读全文
摘要:
1836题意:求最长的先升后降序列分析:d1[i]记录a[1…i]的递增子序列长度,d2[i]记录a[n…i]的递增子序列长度。2593题意:求数组的最大两个子串的和分析:前后分别执行一遍最大子串和将1到i的最大和保存在Left[i]中,将n到i的最大和保存在Right[i]中枚举分割点i Left[i]+Right[i+1]的最大值即为所求2192题意:给三个字符串s1,s2,s3 问能不能用s1 s2的字母组合成s3 其中s1 s2中的字母相对顺序不能改变例如cat tree可以组成tcraete 但不能组成cttaree分析:dp(i,j)表示当前处理到s1[i] s2[j]处,dp(i 阅读全文
摘要:
题意:黑书P123 有一款方块消除的游戏,游戏规则如下:n个带颜色方块排成一列,相同颜色的方块连成一个区域(如果两个相邻方块颜色相同,则这两个方块属于同一区域)。游戏时,你可以任选一个区域消去。设这个区域包含的方块数为x,则将得到x^2个分值。方块消去之后,其右边的所有方块就会向左移动,与被消去方块的左边相连。求游戏的最大得分。分析:题目的方块可以表示成color[i], len[i], 1 <= i <= l,其中l表示有多少段不同的颜色方块。color[i]表示第i 段的颜色,len[i]表示第i 段的方块长度。设dp[i,j,k]表示把(color[i], len[i]) , 阅读全文
摘要:
题意:给出几类珍珠,以及它们的单价,要求用最少的钱就可以买到相同数量的,相同(或更高)质量的珍珠。规定买任一类的珍珠n个(价格为p),都要支付(n+10)*p的钱,即额外支付10*p,输入的价格递增。 例如:31 101 11100 12需要买第一类1个,第二类1个,第三类100个按常规支付为 (1+10)*10 + (1+10)*11 + (100+10)*12 = 1551元(一共买了102个珍珠)但是如果全部都按照第三类珍珠的价格支付,同样是买102个,而且其中总体质量还被提高了,但是价格却下降了:(102+10)*12 = 1344元分析:设三种珍珠的个数和价格分别为(a1 p1), 阅读全文