題目大意:給你乙個機械人,從左上角走到右下角需要的最少改變格仔的次數。格仔有.代表空和b代表障礙物組成,可以b變.,也可以.邊b。
思路:dp[i][j][0]表示當前節點向下走到終點需要的最少改變次數,dp[i][j][1]表示當前節點向右走走到終點的最少改變次數。
那麼如果當前點需要向右走,就需要判斷右面點的dp值哪乙個更小,1、如果需要轉彎則需要再往右判斷一位,如果是b或邊界則 dp[i][j][1] = dp[i][j+1][0];否則dp[i][j][1] = dp[i][j+1][0] + 1;2、不需要轉彎dp[i][j][1] = dp[i][j+1][1];
向下走同理!
ps:當晚筆試忽略了 vice versa (反之亦然) , 第二天被起始格仔的值坑了,如果他有b也當『.』算,所以最後遞推輸出時需要判斷一下a[1][2];
對於英語,也是醉了。
#include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std;
#pragma comment(linker, "/stack:102400000,102400000")
#define maxn 205
#define mod 1000000007
#define mem(a , b) memset(a , b , sizeof(a))
#define ll long long
const long long inf=0x3fffffff;
int dp[110][110][2];
char a[110][110];
int main()
a[1][1] = '.';
//cout << a[n][m] << endl;
if(a[n][m] == 'b')
dp[n][m][0] = dp[n][m][1] = 1;
else
dp[n][m][0] = dp[n][m][1] = 0;
int cnt = 0;
if(a[n][m] == 'b') cnt ++;
for(int i = n-1 ; i >= 1 ; i --)
cnt = 0;
if(a[n][m] == 'b') cnt ++;
for(int i = m-1 ; i >= 1 ; i --)
for(int i = n-1 ; i >= 1 ; i --)
else dp[i][j][1] = dp[i][j+1][1];
if(dp[i+1][j][0] > dp[i+1][j][1]) //下邊走下乙個要轉彎
else dp[i][j][0] = dp[i+1][j][0];
if(a[i][j] == 'b') dp[i][j][0]++ , dp[i][j][1] ++;}}
// int ans = min(dp[1][1][0] , dp[1][1][1]);
int ans ;
if(dp[1][1][0] < dp[1][1][1] && m > 1 && a[1][2] == 'b') ans = dp[1][1][0];
else ans = dp[1][1][1];
// if(a[1][1] == 'b') ans --;
// if(a[n][m] == 'b') ans ++;
printf("%d\n" , ans);
}return 0;
}
微軟公司面試全程解析 4
官的好感。5 誠實地回答問題許多大學生往往僅注重技術的提高,而忽略人品的培養。如撰寫 時,一稿多投 引用別人學說不加註明 不給專案協作者署名等 小事 常使大學生的人品遭受考驗,但很多學生對此並未意識到。面試中,誠信是最好的對策,不誇大已經取得的成績,當被問到乙個不懂的難題時學會說 不 這是面試者最明...
Hiho 123 字尾陣列四 重複旋律4
首先列舉 k,l 中的這個l,再列舉起始位置i,計算suffix i 和suffix i l 的lcp,記作lcp l,i 那麼k l,i 就等於lcp l,i l 1。對於所有的迴圈節長度l和起始位置i,最大的k l,i 就是答案。using system namespace hiho stati...
20160413,微軟4月12日發布13個安全補丁
補丁列表如下 公告id 公告標題和執行摘要 最高嚴重等級 和漏洞影響 重新啟動要求 受影響的軟體 ms16 037 internet explorer累積安全更新 3148531 此安全更新修復了 internet explorer 中的多個漏洞。如果使用者使用 internet explorer ...