动态规划算法java代码 动态规划算法java代码怎么写
·代表任意一个字符,*代表任意一串字符,判断两个字符串是否匹配?
Java代码:
成都创新互联-专业网站定制、快速模板网站建设、高性价比高州网站开发、企业建站全套包干低至880元,成熟完善的模板库,直接使用。一站式高州网站制作公司更省心,省钱,快速模板网站建设找我们,业务覆盖高州地区。费用合理售后完善,10年实体公司更值得信赖。
public static void main(String[] args) {
System.out.println(isMatch("asdfgvbbnchb", "as*bnc.b"));
}
/**
* 动态规划法判断普通字符串是否与通配符字符串匹配。
*
* pre
* 算法思路:
* 设s为普通字符串,p为通配符字符串,字符串中字符编号以0起始。
* 申请布尔型数组 dp[s.length+1][p.length+1]。
* 1. dp[0][0]表示s为空串、p为空串时是否匹配,显然为true,dp[0][0]=true。
* 2. dp[0][j+1],0=jp.length,表示s为空串时,s与p[0..j]是否匹配,
* 当dp[0][j]=true且p[j]='*'时,dp[0][j+1]=true。
* 如果dp[0][j]=false,即p[0..j-1]已经不能与空串匹配了,显然加上p[j]
* 也不能匹配。
* 如果p[j]!='*',则p[j]必须与一个字符匹配,而s为空串,显然不能匹配。
* 3. dp[i+1][j+1]表示s[0..i]与p[0..j]是否匹配。
* 3.1 如果p[j]='*',那么可以有两种匹配方式:
* 方式1. p[j]与s[i]匹配,s[i]被匹配掉后,还需判断s[0..i-1]是否与
* p[0..j]匹配,故dp[i+1][j+1]=dp[i][j+1]。
* 方式2. p[j]不与s[i]匹配,这时还需判断s[0..i]是否与p[0..j-1]匹配,
* 故dp[i+1][j+1]=dp[i+1][j]。
* 综合两种情况,dp[i+1][j+1]=dp[i][j+1]||dp[i+1][j]。
* 3.2 如果p[j]='.',则p[j]必须和s[i]匹配,还需判断s[0..i-1]是否与
* p[0..j-1]匹配,故dp[i+1][j+1]=dp[i][j]。
* 3.3 如果p[j]为其他字符并且与s[i]相同,则p[j]必须和s[i]匹配,还需判断
* s[0..i-1]是否与p[0..j-1]匹配,故dp[i+1][j+1]=dp[i][j]。
* 这种情况可以与情况3.2合并。
* 最终 dp[s.length][p.length] 即表示s与p是否匹配。
* /pre
*
* @param s
* 普通字符串。
* @param p
* 通配符字符串。
* @return 如果普通字符串与通配符字符串匹配则返回true,否则返回false。
*/
public static boolean isMatch(String s, String p) {
boolean[][] dp = new boolean[s.length() + 1][p.length() + 1];
dp[0][0] = true;
for (int j = 0; j p.length(); j++) {
if (dp[0][j] p.charAt(j) == '*') {
dp[0][j + 1] = true;
}
}
for (int i = 0; i s.length(); i++) {
for (int j = 0; j p.length(); j++) {
if (p.charAt(j) == '*') {
dp[i + 1][j + 1] = dp[i][j + 1] || dp[i + 1][j];
} else if (p.charAt(j) == '.' || p.charAt(j) == s.charAt(i)) {
dp[i + 1][j + 1] = dp[i][j];
}
}
}
return dp[s.length()][p.length()];
}
java动态规划算法求给定的值
public class Test { /*创建类*/public static void main(String[] args) {System.out.println(dg(100));}static int dg(int i) { /*定义变量 */int sum;if (i == 1) /*假设条件*/return 1;elsesum = i + dg(i - 1); /*1~100的和的表达式*/retur...
~~求解~~用动态规划算法求两数组各元素间差的最小值,JAVA代码或方法思路
import java.util.Arrays;
public class Test {
public static void getCha(int [] a,int []b){
int min =Integer.MAX_VALUE;
int sss=0;
int kkk = 0;
int c = 0;
int d = 0;
for (int i = 0; i a.length; i++) {
for (int j = 0; j b.length; j++) {
int temp = Math.abs(a[i]-b[j]);
if(tempmin){
min = temp;
sss = a[i];
kkk = b[j];
c=i;
d=j;
}
}
}
System.out.println("最大差距:"+min+"数组A["+c+"]"+sss+"数组B["+d+"]"+kkk);
}
public static void main(String[] args) {
int []a = new int[8];
int []b = new int[12];
for (int i = 0; i a.length; i++) {
a[i] = (int)( Math.random()*100);
}
System.out.println(Arrays.toString(a));;
for (int i = 0; i b.length; i++) {
b[i] = (int) (Math.random()*100);
}
System.out.println(Arrays.toString(b));
getCha(a,b);
}
}
java动态规划 计算数n由k个数相加而成的情况数
public class MyClass {
public static void main(String[] args) {
System.out.println(" result count:" + method(6, 3));
}
public static int method(int n, int k) {
ListListInteger list = new ArrayList();
for (int i = 0; i k; i++) {
if (i == 0) {
for (int j = 1; j n; j++) {
ListInteger li = new ArrayList();
li.add(j);
list.add(li);
}
continue;
}
ListListInteger listNew = new ArrayList();
for (ListInteger integers : list) {
for (int j = integers.get(integers.size() - 1); j n; j++) {
ListInteger li = new ArrayList();
li.addAll(integers);
li.add(j);
listNew.add(li);
if (i + 1 == k) {
int res = 0;
for (Integer integer : li) {
res += integer;
}
if (res != n) {
listNew.remove(li);
}
}
}
}
list.clear();
list.addAll(listNew);
}
for (ListInteger integers : list) {
for (Integer integer : integers) {
System.out.print(integer + "\t");
}
System.out.println();
}
return list.size();
}
}
本文标题:动态规划算法java代码 动态规划算法java代码怎么写
本文地址:http://azwzsj.com/article/dojogje.html