sdut 取数字问题(深搜,动态规划)
生活随笔
收集整理的這篇文章主要介紹了
sdut 取数字问题(深搜,动态规划)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
/*
首先看見這題想到的就是DFS但是求的是最短路徑因此可以利用BFS,但是BFS學的太渣了,還是用動態規劃來試試!
dp[i][j]表示走到第i行j列時候的路徑
dp[i][j]=min(dp[i-1][j],dp[i][j-1])+a[i][j];但是這樣寫的缺陷是不能找出最小正整數的路徑
#include<cstdio>
#include<algorithm>
#include<iostream>
using namespace std;
int main()
{
? ? int a[100][100],m,n;
? ? while(~scanf("%d%d",&m,&n))
? ? {
? ? ? ? for(int i=1;i<=m;++i)
? ? ? ? ? ? for(int j=1;j<=n;++j)
? ? ? ? ? ? scanf("%d",&a[i][j]);
? ? ? ? int dp[100][100]={0};
? ? ? ? for(int i=1;i<=m;++i)
? ? ? ? {
? ? ? ? ? ? for(int j=1;j<=n;++j)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? if(i==1&&j==1)
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? dp[i][j]=a[i][j];
? ? ? ? ? ? ? ? ? ? continue;
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? if(i>1&&j>1)
? ? ? ? ? ? ? ? dp[i][j]=min(dp[i-1][j],dp[i][j-1])+a[i][j];
? ? ? ? ? ? ? ? else if(i>1&&j==1)
? ? ? ? ? ? ? ? ? ? dp[i][j]=dp[i-1][j]+a[i][j];
? ? ? ? ? ? ? ? else if(j>1&&i==1)
? ? ? ? ? ? ? ? ? ? dp[i][j]=dp[i][j-1]+a[i][j];
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? printf("%d\n",dp[m][n]>0?dp[m][n]:-1);
? ? }
? ? return 0;
#include <stdio.h> ?
#include <string.h> ?
#include <stdlib.h> ?
??
using namespace std; ?
??
const int N = 15; ?
int inf = 12345678; ?
int a[N][N], i, j, m, n; ?
??
void find(int x, int y,int sum) ?
{ ?
? ? sum = sum + a[x][y]; ?
? ? if( x < m-1 ) find(x+1,y,sum); ?
? ? if( y < n-1 ) find(x,y+1,sum); ?
? ? if( x==m-1&&y==n-1&&sum>0&&sum<inf ) inf = sum; ?
} ?
??
int main() ?
{ ?
? ? scanf("%d%d",&m,&n); ?
? ? for( i = 0;i < m;i++ ) ?
? ? { ?
? ? ? ? for( j = 0;j < n;j++ ) ?
? ? ? ? { ?
? ? ? ? ? ? scanf("%d",&a[i][j]); ?
? ? ? ? } ?
? ? } ?
? ? find(0,0,0); ?
? ? if( inf==12345678 )inf = 0; ?
? ? printf("%d\n",inf); ?
??
? ? return 0; ?
}
首先看見這題想到的就是DFS但是求的是最短路徑因此可以利用BFS,但是BFS學的太渣了,還是用動態規劃來試試!
dp[i][j]表示走到第i行j列時候的路徑
dp[i][j]=min(dp[i-1][j],dp[i][j-1])+a[i][j];但是這樣寫的缺陷是不能找出最小正整數的路徑
#include<cstdio>
#include<algorithm>
#include<iostream>
using namespace std;
int main()
{
? ? int a[100][100],m,n;
? ? while(~scanf("%d%d",&m,&n))
? ? {
? ? ? ? for(int i=1;i<=m;++i)
? ? ? ? ? ? for(int j=1;j<=n;++j)
? ? ? ? ? ? scanf("%d",&a[i][j]);
? ? ? ? int dp[100][100]={0};
? ? ? ? for(int i=1;i<=m;++i)
? ? ? ? {
? ? ? ? ? ? for(int j=1;j<=n;++j)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? if(i==1&&j==1)
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? dp[i][j]=a[i][j];
? ? ? ? ? ? ? ? ? ? continue;
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? if(i>1&&j>1)
? ? ? ? ? ? ? ? dp[i][j]=min(dp[i-1][j],dp[i][j-1])+a[i][j];
? ? ? ? ? ? ? ? else if(i>1&&j==1)
? ? ? ? ? ? ? ? ? ? dp[i][j]=dp[i-1][j]+a[i][j];
? ? ? ? ? ? ? ? else if(j>1&&i==1)
? ? ? ? ? ? ? ? ? ? dp[i][j]=dp[i][j-1]+a[i][j];
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? printf("%d\n",dp[m][n]>0?dp[m][n]:-1);
? ? }
? ? return 0;
}*/
深搜(看了網上的)
#include <iostream> ?#include <stdio.h> ?
#include <string.h> ?
#include <stdlib.h> ?
??
using namespace std; ?
??
const int N = 15; ?
int inf = 12345678; ?
int a[N][N], i, j, m, n; ?
??
void find(int x, int y,int sum) ?
{ ?
? ? sum = sum + a[x][y]; ?
? ? if( x < m-1 ) find(x+1,y,sum); ?
? ? if( y < n-1 ) find(x,y+1,sum); ?
? ? if( x==m-1&&y==n-1&&sum>0&&sum<inf ) inf = sum; ?
} ?
??
int main() ?
{ ?
? ? scanf("%d%d",&m,&n); ?
? ? for( i = 0;i < m;i++ ) ?
? ? { ?
? ? ? ? for( j = 0;j < n;j++ ) ?
? ? ? ? { ?
? ? ? ? ? ? scanf("%d",&a[i][j]); ?
? ? ? ? } ?
? ? } ?
? ? find(0,0,0); ?
? ? if( inf==12345678 )inf = 0; ?
? ? printf("%d\n",inf); ?
??
? ? return 0; ?
}
總結
以上是生活随笔為你收集整理的sdut 取数字问题(深搜,动态规划)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 拓扑排序 详解 + 并查集 详解 + 最
- 下一篇: 支持向量机(SVM)的实现