dp打開思路4:POJ1189 UVA12511 HDU2845 HBCPC K

POJ1189

http://poj.org/problem?id=1189

怎么說呢,不算難,但是容易出問題

我一開始的思路是,第一個釘子只有一種情況,然后下面每個釘子:左邊有釘子就加左邊的情況數,右邊有釘子就加右邊的情況數,上邊沒釘子就加就加上上面的情況。(加情況均是因為小球可以到這里)

我們想到的就是概率問題,這樣用情況數量做的話,情況數量統計的確實沒錯,我想最后把某個位置情況除以總情況就好了,其實是不行的,因為每種情況發生的概率是不一樣的,這就是我失敗的原因。

后來想到其他方法:假設開始就有n個球,然后每次遇到釘子就分散,也就是數量減少一半,其他一樣,也就是說左右有釘子都只加上數量的一半,這就解決了概率問題。

dp可以“人人為我”或者“我為人人”,這種思路明顯是人人為我,如果是我為人人推的話,會更加簡潔,對于每個釘子,

1、下面有釘子的時候:dp[i+1][j]+=dp[i][j]/2,dp[i+1][j+1]+=dp[i][j]/2,

2、下面沒釘子時:dp[i+2][j+1]+=dp[i][j];

操作簡單,不貼代碼

UVA 12511

題意:最長公共上升子序列LIS,對,你沒有聽錯就是最長上升子序列,兩個序列公共的LCS。

思想結合一下咯

LIS設DP[i]表示以第i個數字結尾的最長上升子序列的長度
DP[i]=max(DP[j]+1){1<=j<=i-1}LCS設DP[i][j]表示以A串第i個字符結尾以B串第j個字符結尾的最長字串
當a[i]==b[j]時:DP[i][j]=DP{i-1][j-1]+1;
當a[i]!=b[j]時:DP[i][j]=max(DP[i-1][j],DP[i][j-1])LCIS設DP[i][j]表示以a串前i個字符b串的前j個字符且以b[j]為結尾構成的LCIS的長度
當a[i]!=b[j]時:DP[i][j]=DP[i-1][j]
當a[i]==b[j]時:DP[i][j]=max(DP[i-1][k])+1 1<=k<=j-1 && b[j]>b[k]

這個值得貼代碼:

#include<iostream>
#include<cstdio>
#include<string>
#include<string.h>
#include<cstring>
#include<cmath>
#include<sstream>
#include<iomanip>
#include<algorithm>
#include<vector>
using namespace std;
int dp[1005][1005],a[1005],b[1005],i,j,t,n1,n2,maxn; 
int main() 
{ scanf("%d",&t); while(t--){ scanf("%d",&n1); for(i=1;i<=n1;i++) scanf("%d",&a[i]); scanf("%d",&n2);for(i=1;i<=n2;i++) scanf("%d",&b[i]); memset(f,0,sizeof(f)); for(i=1;i<=n1;i++) { maxn=0; for(j=1;j<=n2;j++) { dp[i][j]=dp[i-1][j];//不相等if (a[i]>b[j]&&maxn<dp[i-1][j]) maxn=dp[i-1][j];//更新maxnif (a[i]==b[j]) dp[i][j]=maxn+1;//相等} } maxn=0; for(i=1;i<=n2;i++)if(maxn<dp[n1][i])maxn=dp[n1][i];printf("%d\n",maxn);}return 0;
}

HDU2845

http://acm.hdu.edu.cn/showproblem.php?pid=2845

題意:給出n*m的矩陣 如果選擇了其中一個格子就可以得到該格子上的權值

但是它左邊和右邊的格子就不能選 然后上下兩行的格子也不能選擇?

?

很簡單的dp 無非是選擇與不選擇 ?對于每一行來說 選擇了j-1的路徑 或者 選擇j-2的路徑?

而j-2的路徑可以得到當前點的權值

然后對于每一列來說也是選擇i-1的行或者是i-2的行的路徑即可

#include<iostream>
#include<stdio.h>
#include<cstdio>
using namespace std;
#define maxn 222222
int x[maxn],y[maxn];
int main(){int n,m,ox;while(~scanf("%d%d",&n,&m)){for(int i=2;i<=n+1;++i){for(int j=2;j<=m+1;++j){scanf("%d",&ox);x[j]=max(x[j-1],x[j-2]+ox);}y[i]=max(y[i-1],y[i-2]+x[m+1]);}printf("%d\n",y[n+1]);}return 0;
}

K Multiple Longest Commom Subsequence?

http://newoj.acmclub.cn/contests/1359/problem/6

題意:最長公共子序列,要求序列每個元素重復k次,比如1122重復兩次,111222重復三次。

輸入兩個字符串和k,輸出長度。

最長公共子序列的一個變形。。。

動態規劃。設dp[i][j]表示a串處理到i位置,b串處理到j位置的答案。預處理出從a串i位置向前數,第k個與i位置數
字相同的位置p[i],用相同方式處理出B串的q[i]。
則轉移方程為dp[i][j]=max(dp[i-1][j],dp[i][j-1],dp[i-p[i]][j-q[j]]+1),其中第三種轉移必須在a[i]=b[j]的情況下轉移。

?

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/445631.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/445631.shtml
英文地址,請注明出處:http://en.pswp.cn/news/445631.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

第五次課 課上代碼

第五次 雙重循環——排序&#xff08;復習&#xff09; While循環 Break continue 字符串&#xff08;len&#xff0c;取值改值&#xff0c;格式化&#xff09; 列表生成式 >>> for i in range(4): for j in range(4): print(i,j) 0 0 0 1 0 2 0 3 1…

第六次課 課上代碼

oj的使用 Python Split 函數&#xff08;優點&#xff1a;抽象、簡潔。 舉例&#xff1a;str\int\float\abs 具體實現&#xff09; ninput().split(" ") 3 4 >>> print(int(n[0])int(n[1])) 7 >>> print(12345) 15 l[1,2,3,4,5] >>&g…

橙白oj18訓練作業1-題解、代碼

學習資料和oj如何使用加軟件官方qq群739979255 oj網址&#xff1a;http://oj.acm-icpc.top/ a題&#xff1a;原題為輸入兩個數&#xff0c;一行&#xff0c;用空格隔開&#xff0c;因為python操作對萌新來說略難&#xff0c;改為一行一個數&#xff0c;算出ab。 思路&#x…

橙白oj18訓練作業2-題解、代碼

http://oj.acm-icpc.top/ a題&#xff1a;三個數字排序 可以利用sort函數排序&#xff0c;或者自己想清楚邏輯自己寫&#xff0c;我給出一個正確邏輯 &#xff08;拓展冒泡和其他排序參考https://blog.csdn.net/hebtu666/article/details/81434236&#xff09; a,b,cinput(…

時間空間復雜度概述

找個時間寫一寫時間復雜度和一些問題分類&#xff0c;也普及一下這方面知識。 如何衡量一個算法好壞 很顯然&#xff0c;最重要的兩個指標&#xff1a;需要多久可以解決問題、解決問題耗費了多少資源 那我們首先說第一個問題&#xff0c;要多長時間來解決某個問題。那我們可…

二叉樹遍歷算法總結

文章目錄前提要素深度優先搜索DFS經典遍歷算法前序遍歷遞歸版迭代版中序遍歷遞歸版迭代版后序遍歷遞歸版迭代版Morris遍歷算法中序遍歷前序遍歷后序遍歷廣度優先搜索BFS按層遍歷參考資料前提要素 本文代碼用Java實現。 //二叉樹節點結構 public static class TreeNode {publi…

時間復雜度 P/NP/NPC

你會經常看到網上出現“這怎么做&#xff0c;這不是NP問題嗎”、“這個只有搜了&#xff0c;這已經被證明是NP問題了”之類的話。你要知道&#xff0c;大多數人此時所說的NP問題其實都是指的NPC問題。他們沒有搞清楚NP問題和NPC問題的概念。NP問題并不是那種“只有搜才行”的問…

kmp1-HDU1711 HDU1686 HDU2087 HDU3746

HDU 1711 kmp模板題 http://acm.hdu.edu.cn/showproblem.php?pid1711 #include<stdio.h> #include<string.h> #define N 1000005 int s[N]; int p[N]; int next[N]; int m,n; void getnext(){int j0,k-1;next[0]-1;while(j<m){if(k-1||p[j]p[k]){j;k;next[j]…

kmp2-HDU1358 HUST1010 POJ2406 POJ2752

HDU1358 http://acm.hdu.edu.cn/showproblem.php?pid1358 先構造出 next[] 數組&#xff0c;下標為 i&#xff0c;定義一個變量 j i - next[i] 就是next數組下標和下標對應值的差&#xff0c;如果這個差能整除下標 i&#xff0c;即 i%j0 ,則說明下標i之前的字符串&#xff0…

18暑期培訓總結

暑假一共直播講了七次課&#xff0c;每次一小時到一個半小時&#xff0c;前六次講解python主要實用語法&#xff0c;最后一次講了學習方法和簡單基礎的思想和算法。由于時間有限&#xff0c;不能做到很好&#xff0c;請見諒。 學院做題網站&#xff1a;橙白oj http://oj.acm-i…

第七次課 課上代碼

時間空間復雜度&#xff08;例子&#xff1a;1-n求和&#xff09; 復雜度&#xff1a;https://blog.csdn.net/hebtu666/article/details/82463970 https://blog.csdn.net/hebtu666/article/details/82465495 二分 一個數組查找某個值1 2 3 5 6 7 8 9 10 15 20。。 查找11 …

數據結構課上筆記1

第一節課復習了c語言的一些知識&#xff0c;并簡單介紹了數據結構這門課程。 1、引用和函數調用&#xff1a; 1.1引用&#xff1a;對一個數據建立一個“引用”&#xff0c;他的作用是為一個變量起一個別名。這是C對C語言的一個重要補充。 用法很簡單&#xff1a; int a 5; …

并查集實現

并查集是什么東西&#xff1f; 它是用來管理元素分組情況的一種數據結構。 他可以高效進行兩個操作&#xff1a; 查詢a&#xff0c;b是否在同一組合并a和b所在的組 萌新可能不知所云&#xff0c;這個結構到底有什么用&#xff1f; 經分析&#xff0c;并查集效率之高超乎想象…

字符串上的簡單動態規劃

因為數據結構快學串了&#xff0c;以前又做過一些字符串dp的題&#xff0c;今天突然就想把它們寫在一起吧。 直接開始 問題1&#xff1a;給兩個字符串&#xff0c;求最長公共子串 問題2&#xff1a;給兩個字符串&#xff0c;求最長公共子序列 問題3&#xff1a;給一個字符串…

線段樹簡單實現

首先&#xff0c;線段樹是一棵滿二叉樹。&#xff08;每個節點要么有兩個孩子&#xff0c;要么是深度相同的葉子節點&#xff09; 每個節點維護某個區間&#xff0c;根維護所有的。 如圖&#xff0c;區間是二分父的區間。 當有n個元素&#xff0c;初始化需要o(n)時間&#xf…

樹狀數組實現

樹狀數組能夠完成如下操作&#xff1a; 給一個序列a0-an 計算前i項和 對某個值加x 時間o(logn) 注意&#xff1a;有人覺得前綴和就行了&#xff0c;但是你還要維護啊&#xff0c;改變某個值&#xff0c;一個一個改變前綴和就是o(n)了。 線段樹樹狀數組的題就是這樣&#x…

數據結構課上筆記2

今天繼續說明了一些基本概念&#xff0c;講解了時間空間復雜度。 &#xff08;對于概念的掌握也很重要&#xff09; 元素之間的關系在計算機中有兩種表示方法&#xff1a;順序映像和非順序映像&#xff0c;由此得到兩種不同的儲存結構&#xff1a; 順序存儲結構和鏈式存儲結構…

雙端單調隊列

上次我們介紹了單調棧結構https://blog.csdn.net/hebtu666/article/details/82717317 這次介紹一種新的數據結構&#xff1a;雙端隊列&#xff1a;雙端隊列是指允許兩端都可以進行入隊和出隊操作的隊列&#xff0c;其元素的邏輯結構仍是線性結構。將隊列的兩端分別稱為前端和后…

KMP子字符串匹配算法學習筆記

文章目錄學習資源什么是KMP什么是前綴表為什么一定要用前綴表如何計算前綴表前綴表有什么問題使用next數組來匹配放碼過來構造next數組一、初始化二、處理前后綴不相同的情況三、處理前后綴相同的情況使用next數組來做匹配代碼總覽測試代碼時間復雜度分析學習資源 字符串&…