动态规划:
例子:求两个字符串的最大公共子序列,公式.
分析:
根据分析不相等的话右下角为左和上的最大值。相等的时候是左上角+1。
变换的问题:一旦左面是1,则右面全是1。
相当于a与random
同理竖着的也是。
最后的结果。
代码:
package lcs;
public class Lcs {
public int findLCS(String A,String B){
int n = A.length();
int m = B.length();
char[] a = A.toCharArray();
char[] b = B.toCharArray();
int [][] dp = new int[n][m];
//第一行的
for(int i = 0;i<n;i++){
if(a[i] == b[0]){
dp[i][0] = 1;
for(int j = i+1;j<n;j++){
dp[j][0] = 1;
}
break;
}
}
//第一列的
for(int i = 0;i<m;i++){
if(a[0] == b[i]){
dp[0][i] = 1;
for(int j = i+1;j<m;j++){
dp[0][j] = 1;
}
break;
}
}
for(int i = 1;i<n;i++){
for(int j = 1;j<m;j++){
if(a[i] == b[j]){
dp[i][j] = dp[i-1][j-1]+1;
}else{
dp[i][j] = Math.max(dp[i-1][j], dp[i][j-1]);
}
}
}
for(int i = 0;i<n;i++){
for(int j = 0;j<m;j++){
System.out.print(dp[i][j]+" ");
}
System.out.println();
}
return dp[n-1][m-1];
}
public static void main(String [] args){
Lcs lcs = new Lcs();
int findLCS = lcs.findLCS("android", "random");
System.out.println("公共子串"+findLCS);
}
}
回溯算法:
题目是皇后在行和列和对角线不会出现碰撞的。
cols[m]m是第几列,值是第m列的第几行是有皇后的。
代码:
package queen;
public class Queen {
public static int num = 0;//累计方案
public static final int MAXQUEEN = 8;//放置的皇后数量放几个棋盘就是多大
public static int[] cols = new int[MAXQUEEN];//定义cols数组,表示8列棋子皇后摆放的位置 下标是列值是行
public void getCount(int n){
boolean [] rows = new boolean[MAXQUEEN];//记录每列每个方格是否可以放皇后
for(int m = 0;m<n;m++){//m是列
rows[cols[m]] = true;//cols[m]值是第几行有皇后m是列,前几列的这几行是不能填的
int d = n - m;//斜对角 列数之间的差距
//正斜方向就是左面低右面高
if(cols[m]-d>=0){ rows[cols[m] -d] = true;//这个是算的哪个不能填的,cols[m]3是行-d为差值1=2则第二行是不能填写的。
}//反斜方向就是右面低左面高
if(cols[m]+d<=(MAXQUEEN-1)){
rows[cols[m]+d] = true;//同理
}
}
for(int i = 0;i<MAXQUEEN;i++){//MAXQUEEN也是行也是列 //到此知道了哪些位置不能放皇后i行
if(rows[i]){
//不能放
continue;
}
cols[n] = i;//n是列cols[n]是第几行
if(n<MAXQUEEN-1){//最后一列放好了就是好了
getCount(n+1);
}else{ //下面可能仍然有合法位置
//找到完整的一套方案
num++;
printQueen();
}
}
}
private void printQueen() {
System.out.println("第"+num+"种方案");
for(int i = 0;i<MAXQUEEN;i++){
for(int j = 0;j<MAXQUEEN;j++){
if(i == cols[j]){ System.out.print("0 ");
}else{ System.out.print("+ "); }
}System.out.println();
}
}
public static void main(String[] args){
Queen queen = new Queen();queen.getCount(0);
}
}