动规基础
2016cxg
这个作者很懒,什么都没留下…
展开
-
最大连续和
dp[i] 表示以i结尾的最大连续和=状态dp[i]=dp[i-1]<0?a[i]:dp[i-1]+a[i]=状态转移方程//最大连续和#include<iostream> #include<cstdio>#include<algorithm>using namespace std;const int maxn=10000;int a[maxn];int dp[maxn];int原创 2017-03-04 08:46:01 · 179 阅读 · 0 评论 -
最长公共子序列
状态:dp[i][j]表示字符串A的第i位和B的第j位之前的最大公共子序列转移:dp[i][j]=(s1[i]==s2[j])?dp[i-1][j-1]+1:max(dp[i-1][j],dp[i][j-1]);//解释就是对于A的某一位i,遍历B的所有字符,如果相等,则dp[i-1][j-1]+1;//如果不等,就是max(dp[i-1][j],dp[i][j-1]);//最长公共子序列原创 2017-03-06 13:16:38 · 160 阅读 · 0 评论 -
区间DP-最优矩阵链乘
状态:dp[i][i+k]表示i到i+k区间最优解转移:d[i][i+k]=min(d[i][i+k],d[i][j]+d[j+1][i+k]+a[i-1]*a[j]*a[i+k]);//解释为j划分区间i到i+k,划分代价为a[i-1]*a[j]*a[i+k]#include<iostream>#include<cstring>#include<cstdio>#include<algor原创 2017-03-06 19:22:14 · 297 阅读 · 0 评论 -
最大上升子序列
dp[i]表示以i元素结尾的最大上升子序列的元素个数=状态dp[i]=max(dp[i],dp[j]|j<i&&a[j]<a[i])=状态转移方程//解释就是找i前面的最大的dp[j]并且j元素小于i元素//模板 for(int i=1;i<=T;i++){ dp[i]=1; for(int j=i-1;j>0;j--) if(a[原创 2017-03-04 08:37:10 · 239 阅读 · 0 评论 -
矩阵快速幂
struct Matrix{ int row,col; static const int N=5; ll mat[N][N]; void init(int r,int c,bool one=false){ row=r; col=c; memset(mat,0,sizeof(mat)); if(!one)原创 2017-02-11 02:44:14 · 186 阅读 · 0 评论 -
动规-01背包\完全背包\多重背包\混合多重背包模板
转载:http://blog.csdn.net/lyhvoyage/article/details/8545852初始化问题:f[V]为所求1、如果背包要求正好装满则初始化 f[0] = 0, f[1~w] = -INF; 2、如果不需要正好装满 f[0~v] = 0; //01背包模板for(int i=0;iT-1;i++)//尝试所有物品 for(int原创 2017-02-10 15:39:38 · 221 阅读 · 0 评论