随笔分类 - 动态规划--线性dp
摘要:链接dp[i][j] += dp[i-1][j-g];背包吧数据太大了 还是JAVA好用 1 import java.io.*; 2 import java.math.*; 3 import java.text.*; 4 import java.util.*; 5 public class Big { 6 public static void main(String[] args) 7 { 8 Scanner cin = new Scanner (System.in); 9 BigInteger[][] dp;10 dp = n...
阅读全文
摘要:链接路径麻烦啊 很多细节 倒回去搜一遍卡了一节数据库。。 1 #include 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 #define LL long long 8 int u,o,path[50010],flag; 9 LL sum[110][510],dp[110][510],f[110][510]; 10 int m,n; 11 void dfs(int u,int v) 12 { 13 if(flag) 14 return ; 15 int i,...
阅读全文
摘要:链接考查大数 正好拿来学习下JAVA JAVA好高端。。 1 import java.io.*; 2 import java.math.*; 3 import java.text.*; 4 import java.util.*; 5 public class Main 6 { 7 8 public static void main(String[] args) 9 {10 Scanner cin = new Scanner (System.in);11 BigInteger[][] dp;12 int n,k,i,j,g;13...
阅读全文
摘要:链接简单递推 1 #include 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 #define LL long long 8 LL dp[510][510]; 9 int main()10 {11 int i,j,n,g;12 LL ans=0;13 scanf("%d",&n);14 for(i = 1; i <= n ;i++)15 dp[i][i] = 1;16 for(i = 1; i <= n ;i++)17 {18 ...
阅读全文
摘要:链接第一道URAL题 简单递推 1 #include 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 #define LL long long 8 LL dp[20][20]; 9 int main()10 {11 int i,j,n,k,g;12 LL ans=0;13 scanf("%d%d",&n,&k);14 for(i = 0 ; i < k ; i++)15 dp[1][i] = 1;16 for(i = 1; i <= n ; i++)17 .
阅读全文
摘要:链接dp好想 根据它定义的 记忆化下就行路径再dfs一遍 刚开始以为要判空格 所以加了判空格的代码 后来知道不用 。。 1 #include 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 #define INF 0xffffff 8 int dp[110][110]; 9 char s[110],q[550]; 10 int dfs(int a,int b) 11 { 12 int i,d1,d2 = INF; 13 if(dp[a][b]!=-1) 14 r...
阅读全文
摘要:链接归属简单树形DP 挺简单的 跟第一道一样 就是我跑偏了题意。。以为要覆盖点 纠结啊 推了N久 推不出啊 然后就郁闷了 打了局游戏 边想边打 实在想不出 看下题解 跑偏了分两种情况D方程见代码 1 #include 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 #define N 2010 8 int f[N]; 9 struct node10 {11 int f,ch,m1,m0,br;12 void init()13 {14 f = m0 =ch = br...
阅读全文
摘要:链接类似最大矩阵 sum存下 枚举最大就是 1 #include 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 int sum[110][110],o[110][110]; 8 int main() 9 {10 int i,j,n,w,h,a,b;11 while(scanf("%d",&n)&&n)12 {13 scanf("%d%d",&h,&w);14 memset(o,0,sizeof(o));15 memset(s
阅读全文
摘要:链接真的1A了。。一开始想复杂了 想着补全再删 没想好 后来想到递归 大的回文串是由小的推过来的一直递归下去 对于当前的i,j可以选择保留或者删除 选个最小的 1 #include 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 #define N 2010 8 #define INF 0xfffffff 9 int v[500][2];10 int dp[N][N];11 char s[N];12 int dfs(int i,int j)13 {14 if(i>j) return 0;15 ...
阅读全文
摘要:简单DP 说是简单 还是推了好一会 推出来觉得好简单保留当前i的最小值 dp[i] = min(dp[i],dp[j]+i-j-1) j 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 #define INF 0xfffffff 8 char s[5010]; 9 int w[500][500],dp[5010];10 int main()11 {12 int i,j,k,n;13 char a,b;14 while(cin>>s)15 {16 memset...
阅读全文
摘要:链接通化邀请赛的题 貌似不怎么难记忆化DP 状态方程类似于2维的 只是变成了4维 每次有四种方向去搜 取最棒的判断好边界条件 1 #include 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 int p1[25],p2[25],sum1[25],sum2[25]; 8 int dp[25][25][25][25]; 9 int dfs(int i1,int j1,int i2,int j2)10 {11 if(dp[i1][j1][i2][j2]!=-1)12 return dp[i...
阅读全文
摘要:我是被这题彻底折腾惨了 。。DP很简单 不用说了 重点是必须按它那个图说来来划分三角形 而不是随便撇下一部分 随便划下一个三角形就可以所以 要判断J是第奇数个点才可以 1 #include 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 int dp1[210][210],sum[210],dp2[210][210]; 8 char s[210][210]; 9 int main()10 {11 int i,j,n;12 cin>>n;13 for(i = 1; i >s[i];...
阅读全文
摘要:昨天晚上写的一题 结果USACO一直挂中 今天交了下有一点点的数论知识 背包很好想 就是不好确定上界官方题解:这是一个背包问题。一般使用动态规划求解。一种具体的实现是:用一个线性表储存所有的节点是否可以相加得到的状态,然后每次可以通过一个可以相加得到的节点,通过加上一个输入的数求出新的可以相加得到的点。复杂度是O(N×结果)。但是可以证明结果不会超过最大的两个数的最小公倍数(如果有的话)。参见数论。所以复杂度也是O(Na2),完全可以接受了。判断无限解可以按上面的方法,另外也可以算所有的数的最大公约数。如果不是1,也就是说这些数不互质,那么不被这个最大公约数整除的数一定构造不出来。当
阅读全文
摘要:简单的01背包 保存下方案总数 其实就是dp[v]值 输出路径dfs一下 1 #include 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 int dp[100010],w[110],path[110],o,f[110],n; 8 void dfs(int sw,int v) 9 {10 int j;11 if(sw==0)12 {13 o = v;14 return ;15 }16 for(j = 1; j >tw;29 ...
阅读全文
摘要:刚开始理解有点误,想成每步都是最优的 ,结果卡在第六组数据上,,无奈瞧了下别人的 发现自己理解错了,,我看的还是中文翻译。。简单的记忆化 1 /* 2 ID: shangca2 3 LANG: C++ 4 TASK: game1 5 */ 6 #include 7 #include 8 #include 9 #include10 #include11 using namespace std;12 int a[210],dp[210][210],s[210];13 int find(int i,int j)14 {15 16 if(i==j)17 {1...
阅读全文
摘要:之前做过一道类似的 国际象棋盘神马的。。统计出以每个1作为右下角的最大正方形 那么以大于二到这个最大值之间为边的正方形都可以以这个为右下角 累加就可以了dp[i][j] = min(dp[i-1][j],dp[i-1][j-1],dp[i][j-1])+1; 1 /* 2 ID: shangca2 3 LANG: C++ 4 TASK: range 5 */ 6 #include 7 #include 8 #include 9 #include10 #include11 using namespace std;12 int dp[255][255],num[255]...
阅读全文
摘要:五维DP,听着挺多的,貌似就是挺裸的dp,最近貌似做简单的DP挺顺手。。1Adp[i][j][e][o][g] = min(dp[i][j][e][o][g],dp[i-i1][j-i2][e-i3][o-i4][g-i5]+p[q]) i1,i2...为满足给出的商品数量的值 p[q]为选用当前优惠方案的价格。 1 /* 2 ID: shangca2 3 LANG: C++ 4 TASK: shopping 5 */ 6 #include 7 #include 8 #include 9 #include10 #include11 using namespace s...
阅读全文
摘要:DP预处理出来 i位不超过j的个数 然后再进行从小到大找第一个比I大的 然后用I减掉上一个比I小的 剩余的按照之前的方法循环找 知道剩余为0细节挺繁琐的 对照数据改了又改 最后一组数据还超 了int。。 1 /* 2 ID: shangca2 3 LANG: C++ 4 TASK: kimbits 5 */ 6 #include 7 #include 8 #include 9 #include10 #include11 using namespace std;12 #define LL long long13 LL dp[32][32],kk[32];14 void...
阅读全文
摘要:链接数据比较小 直接爆了 5重枚举断开的琏 dp[i][j][k] (i-j)区间为第k段 dp[i][j][k] = min(dp[i][j][k],dp[g][i-1][k-1]*s[i][j])(g 2 #include 3 #include 4 #include 5 #include 6 #define INF 100000 7 using namespace std; 8 int a[110],dp1[105][105][15],dp2[55][55][15],s[105][105]; 9 int main()10 {11 int i,j,k,n,g,o,e,aa,b,c;1...
阅读全文
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=4649枚举当前状态是0或者是1的概率 其实就枚举1的概率 最后概率乘这个数位运算用得不熟 老出错 1 #include 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 int a[210]; 8 char c[210]; 9 double p[210],dp[210];10 int main()11 {12 int i,j,n,kk=0;13 while(scanf("%d",&n)!=EOF
阅读全文