分析:dp[i]表示前i天的最大收入。
现排序,然后dp[i]=max(dp[i],dp[a[j].s-1]+a[j].v)(a[j].e
#include
#include
using namespace std;
#define N 110
int dp[N]; //dp[i]表示第i天的最大收入
struct Node
{
int s,e,v;
} node[N*1...
分类:
其他好文 时间:
2015-06-07 17:31:39
阅读次数:
153
分析:d[i][j]表示前i回合获得j分的方法数。
d[i][j]=d[i-1][j-1]+d[i-1][j-2]+d[i-1][j-3]。
我方最多进攻20次,每次得3分,最多20*60的状态量。
#include
using namespace std;
//dp[i][j]代表我方第i轮获得j分的种类数
__int64 dp[26][70...
分类:
其他好文 时间:
2015-06-07 17:30:02
阅读次数:
103
题意:一个钟的三个指针在不停的转动,他们厌烦了这样,当他们互相的距离角度大于等于D时,他们会很开心,问一天之中他们happy的时间占总时间的百分比。
分析:只要找到某一分钟内,他们happy的时间,然后钟每过12个小时相当于43200秒复原一次。因此总时间就是43200秒,只要求出在这43200的happy时间,即可求出百分比。枚举12*60分钟,看一分钟内有多少秒是happy的时间,一分钟内解...
分类:
其他好文 时间:
2015-06-07 15:56:17
阅读次数:
141
分析:dp[l][i][j][k]表示选前l件时花费i元,积分j,免费p时能获得的最大价值。k值也作为一种背包算。
状态转移方程:
dp[l][i][j][k] = max(dp[l][i][j][k], dp[l-1][i-a[l]][j][k]+c[i], dp[l-1][i][j-b[l]][k]+c[i], dp[l-1][i][i][k-1]+c[i]) (k > 0, i >= ...
分类:
其他好文 时间:
2015-06-07 15:49:06
阅读次数:
92
#include
using namespace std;
int mod[20]={1,1,2,6,4,2,2,4,2,8,4,4,8,4,6,8,8,6,8,2};
char s[1010]; //字符串
int num[1010]; //转换为数字
int sovle()
{
int len,i,c,ans;
len=strlen(s);
ans=1;
for(i=0...
分类:
其他好文 时间:
2015-06-07 13:55:30
阅读次数:
128
题意:给一个天数N,求20*20方阵内细菌的变化情况。每次变化加上一个d[k],d数组有给定的16个数。k是某个格子它本身加上它上下左右的四个数。 简单模拟题。
分析:
#include
using namespace std;
int dir[4][2]={{-1,0},{1,0},{0,-1},{0,1}};
char den[]=".!X#";
int D[16];
int map...
分类:
其他好文 时间:
2015-06-07 09:43:15
阅读次数:
102
题意:给一棵树染色,这棵树有n个节点,根结点是r。每个结点都有一个权值ci,开始时间为0,每染色一个结点需要耗时1,每个结点染色代价为ci*ti(ti为当前时间),每个结点只有在父结点被染色的条件下才能被染色。求染完整棵树要花费的最小代价。
分析:贪心总体思路,每次找一个权值最大的节点,如果是根节点,则首先对它染色,否则的话可以得出一个结论,在它父亲已经染色的情况下,立刻给它染色是最优的。对于第...
分类:
其他好文 时间:
2015-06-07 09:40:49
阅读次数:
256
题意:n个洞组成一棵树,有m个士兵,从1号洞开始攻打,每个洞有a个bug和b的价值。一个士兵可以打20个bug,为了拿到这个洞的价值b必须留下k个士兵消灭这个洞的所有bug(k*20>=bug的数量,且留下的士兵不可以再去攻打其他的洞,且必须攻打了前面的洞才可以攻打后面的洞)。问花费这m个士兵可以得到的最大价值是多少。
dp方程:dp[i][j]=max(dp[i][j],dp[i][j-k]...
分类:
其他好文 时间:
2015-06-07 09:35:45
阅读次数:
241
#include
#include
using namespace std;
#define N 1000005
int a[N],dp[N],maxpre[N];
int max(int a,int b)
{
return a>b?a:b;
}
int main()
{
int i,j,n,m,tmp;
while(scanf("%d%d",&m,&n)==2)
{
for(...
分类:
其他好文 时间:
2015-06-06 18:18:43
阅读次数:
330
分析:这里使用树形DP做。
1、最小顶点覆盖做法:最小顶点覆盖 == 最大匹配(双向图)/2。
2、树形DP:
dp[i][0]表示i为根节点,并且该节点不放,所需的最少的点数。
dp[i][1]表示i为根节点,并且该节点放,所需要的最少的点数。
dp[i][0]=sum(dp[son[i][j]][1]) 该点不放,则它的儿子节点必须都放,只有这样之间的边才可以被覆盖。
dp[i...
分类:
其他好文 时间:
2015-06-06 16:42:03
阅读次数:
152