继上面的深搜之后,然后就到了动态规划了。
目录
动态规划
动态规划是从小的问题出发,然后再选择较优的选项,如此类推。直到数据结束为止。
下面的代码就是运用了动态规划的思想来写的
for(int i=n-2;i>=0;i--)
{
for(int j=0;j<=i;j++)
{
b[i][j]=a[i][j]+max(b[i+1][j],b[i+1][j+1]);
}
}
这个代码是从最后一行的数据往上找寻上一行对应的位置附近最大的数字来加,直到去到第一行。
树状数组
树状数组是线段树的一种,凡是能用树状数组解决的问题都能通过线段树来解决。但也不能说树状数组没有用处,它也有优点。
从图中可以看出
C1 = A1
C2 = C1 + A2 = A1 + A2
C3 = A3
C4 = C2 + C3 + A4 = A1 + A2 + A3 + A4
C5 = A5
C6 = C5 + A6 = A5 + A6
C7 = A7
C8 = C4 + C6 + C7 + C8 = A1 + A2 + A3 + A4 + A5 + A6 + A7 + A8
而实现这些功能的代码是:
int lowbit(int i)
{
return i&(-i);
}
void update(int i,int v)
{
while(i<=n)
{
a[i]+=v;
i+=lowbit(i);
}
}
int sum(int i)
{
int sum=0;
while(i>0)
{
sum+=a[i];
i-=lowbit(i);
}
return sum;
}
并查集
并查集是通过一个数组来完成的,通过数组的下标来继续查找,可以查到该内容所对应最终的数据是什么。
这个是实现的代码:
int finds(int x)
{
while(a[x]!=x)
{
x=a[x];
}
return x;
}