今天做了3道题,有一道很简单就没列出来,这两个是我对于动态规划更加完整性的理解的题目,我们将题目列出来:
这道题乍一看,数组之间没有什么特定的规律,也不是去寻找数组之间的规律,动态规划能不能使用呢,但是我们看到总数mn,和消耗ij,我们可以很轻松的总结出dp[i][j]=dp[m-字符中0数量][n-字符中1数量]+1 与dp[i][j]之间的最大值。也就是相当于我们把所有的dp数组都更新一遍,这和01背包问题特别的像,我们开始只有一个字符串,那么更新,有两个字符串,那么更新等等等等,下面我们列出代码:
public int findMaxForm(String[] strs, int m, int n) {
if(strs.length==0) return 0;
int[][] dp=new int[m+1][n+1];
for(String s:strs){
int[] ints=getInt(s);
for(int i=m;i>=ints[0];i--){
for(int j=n;j>=ints[1];j--){
dp[i][j]=Math.max(dp[i][j],1+dp[i-ints[0]][j-ints[1]]);
}
}
}
int res=0;
for(int i=0;i<dp.length;i++){
for(int j=0;j<dp[0].length;j++){
res=Math.max(res,dp[i][j]);
}
}
return res;
}
public int[] getInt(String s){
int[] ints=new int[2];
for (char c:s.toCharArray()){
ints[c-'0']++;
}
return ints;
}
第二题呢,比第一题绕的弯子少的多,列出题干:
看了题目,我们想到就是遍历一下在选定数组之前dp数组的最大值+1,这道题还是比较简单的,我们直接列出代码:
if(pairs.length==1||pairs.length==0) return 0;
int []dp=new int[pairs.length];
Arrays.sort(pairs, new Comparator<int[]>() {
@Override
public int compare(int[] o1, int[] o2) {
return o1[0]-o2[0];
}
});
Arrays.fill(dp,1);
for(int i=1;i<pairs.length;i++){
for(int j=0;j<i;j++){
if(pairs[i][0]>pairs[j][1]){
dp[i]=Math.max(dp[j]+1,dp[i]);
}
}
}
int res=0;
for(int i:dp){
res=Math.max(i,res);
}
return res;
}
需要注意的点,就是第二题,我们需要将数组进行重新排序。噢啦 睡觉去咯